要对一个分组的groupby应用聚合是:
df.groupby('column_name1')['column_name2'].agg(sum)
我有一些数据,如果column1包含值A,我想在sum2上应用sum(),如果值是B,我想对count()进行应用。
完成此操作的语法是什么?
我试图用if语句编写一个for循环,但我希望有一种更好的方法来完成此操作。
答案 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