[英]pandas groupby apply on multiple columns to generate a new column
我喜歡使用groupby-apply在pandas數據幀中生成一個新列。
例如,我有一個數據幀:
df = pd.DataFrame({'A':[1,2,3,4],'B':['A','B','A','B'],'C':[0,0,1,1]})
並嘗試通過groupby-apply生成新列“D”。
這有效:
df = df.assign(D=df.groupby('B').C.apply(lambda x: x - x.mean()))
as(我認為)它返回一個與dataframe具有相同索引的系列:
In [4]: df.groupby('B').C.apply(lambda x: x - x.mean())
Out[4]:
0 -0.5
1 -0.5
2 0.5
3 0.5
Name: C, dtype: float64
但是,如果我嘗試使用多列生成新列,我無法將其直接分配給新列。 所以這不起作用:
df.assign(D=df.groupby('B').apply(lambda x: x.A - x.C.mean()))
回國
TypeError: incompatible index of inserted column with frame index
事實上,groupby-apply返回:
In [8]: df.groupby('B').apply(lambda x: x.A - x.C.mean())
Out[8]:
B
A 0 0.5
2 2.5
B 1 1.5
3 3.5
Name: A, dtype: float64
我可以
df.groupby('B').apply(lambda x: x.A - x.C.mean()).reset_index(level=0,drop=True))
但它似乎很冗長,我不確定這是否會按預期工作。
所以我的問題是:(i)pandas groupby-apply何時返回類似索引的系列與多索引系列? (ii)是否有更好的方法通過groupby-apply到多列來分配新列?
對於這種情況我不認為在應用中包含A列是必要的,我們可以使用transform
df.A-df.groupby('B').C.transform('mean')
Out[272]:
0 0.5
1 1.5
2 2.5
3 3.5
dtype: float64
你可以分配回來
df['diff']= df.A-df.groupby('B').C.transform('mean')
df
Out[274]:
A B C diff
0 1 A 0 0.5
1 2 B 0 1.5
2 3 A 1 2.5
3 4 B 1 3.5
我們在groupby中使用group_keys=False
df.assign(D=df.groupby('B', group_keys=False).apply(lambda x: x.A - x.C.mean()))
輸出:
A B C D
0 1 A 0 0.5
1 2 B 0 1.5
2 3 A 1 2.5
3 4 B 1 3.5
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.