我有一个大型数据集(超过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
谢谢!
答案 0 :(得分:5)
您可以将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