Pandas - Groupby 条件公式

新手上路,请多包涵
   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 完成还是我必须使用上述条件语句附加一个新列?

原文由 George Vince 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 537
2 个回答

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

 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

原文由 ayhan 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果列 SibSpParch 中的值永远小于 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

原文由 jezrael 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题