[英]Panda Group by sum specific columns and keep other columns
我正在嘗試做一些應該簡單的事情......我有一個 dataframe 並且我正在嘗試按特定列進行分組,output dataframe 需要保留一列和另外兩列。 下面是一個例子:
東風:
User Col1ToSum Col2ToSum ColToKeep
ABC 10 440 1.015
ABC 15 410 1.015
ABC 15 -200 1.015
ABA 100 110 2.24
ABA 80 -10 2.24
AAA 40 10 nan
AAA 20 10 nan
BBB 10 15 nan
XYZ 10 10 1.1
XYZ 10 10 1.5 (note the 'ColToKeep' is different for user XYZ)
預期 Output:
User Col1ToSum Col2ToSum ColToKeep
ABC 45 650 1.015
ABA 180 100 2.24
AAA 60 20 nan
BBB 10 15 nan
XYZ 10 10 1.1
XYZ 10 10 1.5
我試着做:
df.groupby(['User', 'ColToKeep'], as_index=False).mean()
不幸的是,它正在刪除 ColToKeep 為 nan 並且要求和的兩列不是求和的任何記錄。df.groupby(['User'], as_index=False)['Col1ToSum', 'Col2ToSum'].sum()
不幸的是,它正在刪除 output df 中的 'ColToKeep' 列df.groupby(['User', 'ColToKeep'], as_index=False)['Col1ToSum', 'Col2ToSum'].sum()
但與第 1 點相同)它正在刪除 ColToKeep 為 nan 的記錄我嘗試按 User 和 ColToKeep 分組的原因是因為如果 User 相同但 ColToKeep 不同,我希望有 2 條記錄。
我不確定為什么 group by 會刪除 nan 值(可能是由於我缺乏熊貓經驗......)
您能否就上述問題提供幫助,甚至解釋為什么會發生這種情況?
Pandas 從1.1
版本開始支持groupby
中的缺失值, 鏈接。
第一個想法是創建新的輔助列new
,將缺失值替換為某個字符串,例如miss
,然后通過GroupBy.agg
和GroupBy.first
將new
與聚合分組,最后通過第一個reset_index
刪除輔助級別:
df = (df.assign(new= df['ColToKeep'].fillna('miss'))
.groupby(['User', 'new'], sort=False)
.agg({'Col1ToSum':'sum', 'Col2ToSum':'sum', 'ColToKeep':'first'})
.reset_index(level=1, drop=True)
.reset_index())
print (df)
User Col1ToSum Col2ToSum ColToKeep
0 ABC 40 650 1.015
1 ABA 180 100 2.240
2 AAA 60 20 NaN
3 BBB 10 15 NaN
4 XYZ 10 10 1.100
5 XYZ 10 10 1.500
另一個想法是將回miss
替換為NaN
s:
df = (df.assign(ColToKeep = df['ColToKeep'].fillna('miss'))
.groupby(['User', 'ColToKeep'], sort=False)[['Col1ToSum', 'Col2ToSum']].sum()
.reset_index()
.replace({'ColToKeep': {'miss':np.nan}}))
print (df)
User ColToKeep Col1ToSum Col2ToSum
0 ABC 1.015 40 650
1 ABA 2.240 180 100
2 AAA NaN 60 20
3 BBB NaN 10 15
4 XYZ 1.100 10 10
5 XYZ 1.500 10 10
將“ColToKeep”更改為字符串,然后使用您的代碼。
In : df['ColToKeep'] = df['ColToKeep'].astype(str)
In : df.groupby(['User','ColToKeep'], as_index=False).sum()
Out:
User ColToKeep Col1ToSum Col2ToSum
0 AAA nan 60 20
1 ABA 2.24 180 100
2 ABC 1.015 40 650
3 BBB nan 10 15
4 XYZ 1.1 10 10
5 XYZ 1.5 10 10
如有必要,您可以通過以下方式將 ColToKeep 更改回浮點數:
df1 = df.groupby(['User','ColToKeep'], as_index=False).sum()
df1['ColToKeep'] = df1['ColToKeep'].astype(float)
print(df1)
User ColToKeep Col1ToSum Col2ToSum
0 AAA NaN 60 20
1 ABA 2.240 180 100
2 ABC 1.015 40 650
3 BBB NaN 10 15
4 XYZ 1.100 10 10
5 XYZ 1.500 10 10
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.