Pandas GroupBy:以逗号分隔的总和列表



我有下面的groupby,它是在";ParentAccount";数量我正试图在同一行显示这笔款项背后的细节。我有一个逗号分隔的帐户列表显示在总额旁边,但我也想添加一列,显示帐户级别的逗号分隔的总和。

所以对于下面的代码,我会在一个单独的列中有以下浮动字符串

ParentAccount 1: 3.75, 1
ParentAccount 2: 14, 10.5

不确定做这件事的最佳方式。我尝试合并两个独立的groupby,但认为可能有更好的方法。

import pandas as pd
data = {
'ParentAccount': [1,1,1,2,2,2],
'Account': ['A', 'A', 'C', 'D', 'D','E'],
'Amount':  [1.5, 2.25, 1, 4.75, 9.25, 10.50],
}
df = pd.DataFrame(data)
df_final = df.groupby('ParentAccount').agg({'Amount': 'sum', 'Account': lambda x: ','.join(x.unique()),}).add_suffix('-Net')
print(df_final)

您可以groupby"ParentAccount";以及";帐户";以找到CCD_ 4;则CCD_ 5〃;ParentAccount";再次,将一个未打包的字典传递给agg,以执行您想要的操作:(i(求和金额,(ii(join为每个ParentAccount指定唯一帐户(iii(join为每个Parent account指定每个帐户的金额:

out = (df
.groupby(['ParentAccount','Account'])
.sum()
.reset_index(level=1)
.groupby(level=0)
.agg(**{'Amount-Net': ('Amount','sum'), 
'Account-Net': ('Account', lambda x: ', '.join(x)) , 
'Amounts per Account': ('Amount', lambda x: ', '.join(x.astype(str)))}))

输出:

Amount-Net Account-Net Amounts per Account
ParentAccount                                            
1                    4.75        A, C           3.75, 1.0
2                   24.50        D, E          14.0, 10.5    

使用双groupby:

out = (
df.groupby(['ParentAccount', 'Account'], as_index=False)['Amount'].sum()
.groupby('ParentAccount', as_index=False)
.agg(**{'Amount-Net': ('Amount', 'sum'),
'Amount-Detail': ('Amount', lambda x: ','.join(x.astype(str))), 
'Account-Net': ('Account', ','.join)})
)

输出:

>>> out
ParentAccount  Amount-Net Amount-Detail Account-Net
0              1        4.75      3.75,1.0         A,C
1              2       24.50     14.0,10.5         D,E

最新更新