Pandas-有条件形式的Groupby

2024-04-25 10:12:57 发布

您现在位置:Python中文网/ 问答频道 /正文

   Survived  SibSp  Parch
0         0      1      0
1         1      1      0
2         1      0      0
3         1      1      0
4         0      0      1

给定上述数据帧,是否有一种优雅的方法来groupby满足条件? 我想根据以下条件将数据分成两组:

(df['SibSp'] > 0) | (df['Parch'] > 0) =   New Group -"Has Family"
 (df['SibSp'] == 0) & (df['Parch'] == 0) = New Group - "No Family"

然后使用这两个组的方法,最终得到如下输出:

               SurvivedMean
 Has Family    Mean
 No Family     Mean

是否可以使用groupby完成,或者我必须使用上面的条件语句追加一个新列?


Tags: 数据方法nodfnewgroupmean条件
3条回答

如果列SibSpParch中的never值小于0,则仅使用一个条件:

m1 = (df['SibSp'] > 0) | (df['Parch'] > 0)

df = df.groupby(np.where(m1, 'Has Family', 'No Family'))['Survived'].mean()
print (df)
Has Family    0.5
No Family     1.0
Name: Survived, dtype: float64

如果无法使用,首先使用两种条件:

m1 = (df['SibSp'] > 0) | (df['Parch'] > 0)
m2 = (df['SibSp'] == 0) & (df['Parch'] == 0)
a = np.where(m1, 'Has Family', 
    np.where(m2, 'No Family', 'Not'))

df = df.groupby(a)['Survived'].mean()
print (df)
Has Family    0.5
No Family     1.0
Name: Survived, dtype: float64

一种简单的分组方法是使用这两列的和。如果其中任何一个为正,则结果将大于1。groupby接受任意数组,只要长度与DataFrame的长度相同,这样就不需要添加新列。

family = np.where((df['SibSp'] + df['Parch']) >= 1 , 'Has Family', 'No Family')
df.groupby(family)['Survived'].mean()
Out: 
Has Family    0.5
No Family     1.0
Name: Survived, dtype: float64

可以在列表中定义条件,并使用下面的函数group_by_condition为每个条件创建筛选列表。然后,您可以使用模式匹配选择结果项:

df = [
  {"Survived": 0, "SibSp": 1, "Parch": 0},
  {"Survived": 1, "SibSp": 1, "Parch": 0},
  {"Survived": 1, "SibSp": 0, "Parch": 0}]

conditions = [
  lambda x: (x['SibSp'] > 0) or (x['Parch'] > 0),  # has family
  lambda x: (x['SibSp'] == 0) and (x['Parch'] == 0)  # no family
]

def group_by_condition(l, conditions):
    return [[item for item in l if condition(item)] for condition in conditions]

[has_family, no_family] = group_by_condition(df, conditions)

相关问题 更多 >