我有一个大型数据集(超过 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
