簡體   English   中英

Panda 按特定列的總和分組並保留其他列

[英]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

我試着做:

  1. df.groupby(['User', 'ColToKeep'], as_index=False).mean()不幸的是,它正在刪除 ColToKeep 為 nan 並且要求和的兩列不是求和的任何記錄。
  2. df.groupby(['User'], as_index=False)['Col1ToSum', 'Col2ToSum'].sum()不幸的是,它正在刪除 output df 中的 'ColToKeep' 列
  3. 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.aggGroupBy.firstnew與聚合分組,最后通過第一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM