Skip to main content
 首页 » 编程设计

Python Pandas Groupby 添加列除法以获得平均值

2025年05月04日21tintown

我有一个大型数据集(超过 15000 行),我试图显示基于投资者数量(而非实际所有权)的投资比例。这是一个已知的故障,但我们正在努力解决表示问题。我目前可以删除 SQL 中的重复项(如果我有 3 个客户投资 600,我会删除重复项以让 1 个客户有 600,但它是全部或全无,相反我想向这三个客户展示每个 200) .

我需要 groupby 函数来考虑 Customerid、parentid 和投资金额。然后我需要创建另一列并为每个赞助商名称/行提供每个客户的平均投资(针对该客户 ID/父 ID 组合的特定美元金额的投资/#customers)。最后,我需要分组,按 SponsorName 汇总投资并计算客户 ID。

数据集:

CustomerID   ParentID    SponsorName    Investment 
1            55          Bob            600 
1            55          Jack           600 
1            55          Mary           600 
5            65          Bill           1200 
5            65          Jim            1200 
5            65          Jill           1200 
1            55          Bob            1000 
1            55          Jack           1000 
1            55          Mary           1000 

输出:

CustomerID   ParentID    SponsorName    Investment   Avg Investment 
1            55          Bob            600          200 
1            55          Jack           600          200 
1            55          Mary           600          200 
5            65          Bill           1200         400 
5            65          Jim            1200         400 
5            65          Jill           1200         400 
1            55          Bob            1000         333.33 
1            55          Jack           1000         333.33 
1            55          Mary           1000         333.33  

谢谢!

请您参考如下方法:

您可以使用 GroupBy + transform 和 size:

counts = df.groupby(['CustomerID', 'ParentID'])['SponsorName'].transform('size') 
df['Avg Investment'] = df['Investment'] / counts 

输出:

   CustomerID  ParentID SponsorName  Investment  Avg Investment 
0           1        55         Bob         600           200.0 
1           1        55        Jack         600           200.0 
2           1        55        Mary         600           200.0 
3           5        65        Bill        1200           400.0 
4           5        65         Jim        1200           400.0 
5           5        65        Jill        1200           400.0 

针对您修改后的问题进行了更新,由@ScottBoston 提供

group_keys = ['CustomerID', 'ParentID', 'Investment'] 
counts = df.groupby(group_keys)['SponsorName'].transform('size') 
df['Avg Investment'] = df['Investment'] / counts 

输出:

   CustomerID  ParentID SponsorName  Investment  Avg Investment 
0           1        55         Bob         600      200.000000 
1           1        55        Jack         600      200.000000 
2           1        55        Mary         600      200.000000 
3           5        65        Bill        1200      400.000000 
4           5        65         Jim        1200      400.000000 
5           5        65        Jill        1200      400.000000 
6           1        55         Bob        1000      333.333333 
7           1        55        Jack        1000      333.333333 
8           1        55        Mary        1000      333.333333