Pandas GroupBy:以逗号分隔的总和列表
Pandas GroupBy: comma separated list of sums
我有下面的 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”和“Account”找到sum
;然后再次 groupby
"ParentAccount",并将解压缩的字典传递给 agg
以执行您想要的操作:(i) 汇总金额和 (ii) join
ing 每个帐户的唯一帐户ParentAccount (iii) join
计算每个 ParentAccount 每个账户的金额:
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
我有下面的 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”和“Account”找到sum
;然后再次 groupby
"ParentAccount",并将解压缩的字典传递给 agg
以执行您想要的操作:(i) 汇总金额和 (ii) join
ing 每个帐户的唯一帐户ParentAccount (iii) join
计算每个 ParentAccount 每个账户的金额:
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