如何对系列应用条件聚集?

时间:2019-01-14 05:33:51

标签: python pandas

要对一个分组的groupby应用聚合是:

df.groupby('column_name1')['column_name2'].agg(sum)

我有一些数据,如果column1包含值A,我想在sum2上应用sum(),如果值是B,我想对count()进行应用。

完成此操作的语法是什么?

我试图用if语句编写一个for循环,但我希望有一种更好的方法来完成此操作。

3 个答案:

答案 0 :(得分:2)

尝试使用以下两行:

df[df['column_name1'].str.contains('A')]=df[df['column_name1'].str.contains('A')].groupby('column_name1')['column_name2'].agg(sum)
df[df['column_name1'].str.contains('B')]=df[df['column_name1'].str.contains('B')].groupby('column_name1')['column_name2'].agg('count')

答案 1 :(得分:1)

您可以为此编写一个函数(显然,您可以按照自己的方式自定义它):

def my_func(row):
    b = row[row.column_name1.str.contains('A')].column_name2.sum()
    c = row[row.column_name1.str.contains('B')].column_name2.count()
    return pd.Series({'Sum':b, 'Count':c})

df.groupby('column_name1').apply(my_func).reset_index()

    column_name1    Sum Count
0   A               8   0
1   B               0   2

答案 2 :(得分:1)

GroupBy.apply使用自定义功能:

df = pd.DataFrame({
    'column_name1': ['A','A','A','A1','B','B1','C'],
    'column_name2': np.arange(1, 8)
})
print (df)
  column_name1  column_name2
0            A             1
1            A             2
2            A             3
3           A1             4
4            B             5
5           B1             6
6            C             7

def f(x):
    if x.column_name1.str.contains('A').any():
        return x['column_name2'].sum()
    elif x.column_name1.str.contains('B').any():
        return x['column_name2'].count()
    else:
        return 0

df = df.groupby('column_name1').apply(f).reset_index(name='new')
print (df)
  column_name1  new
0            A    6
1           A1    4
2            B    1
3           B1    1
4            C    0