Python Pandas Groupby添加列分隔以获取平均值

时间:2018-08-29 13:49:11

标签: python pandas pandas-groupby

我有一个大型数据集(超过15k行),我试图根据投资者数量(而非实际所有权)显示投资的比例份额。这是一个已知的故障,但是我们正在尝试解决表示形式。我目前可以在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 

谢谢!

1 个答案:

答案 0 :(得分:5)

您可以将GroupBytransformsize一起使用:

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