我有一个数据集,其中包含客户信息,他们花钱的产品以及他们花了多少钱。 即。
Clients Products Profit
0 client 1 A 100
1 client 1 A 120
2 client 1 B 30
3 client 1 C 70
4 client 2 A 50
5 client 2 B 40
6 client 2 C 70
7 client 2 A 80
8 client 3 B 90
9 client 3 C 30
现在我确实遇到了一些问题:
1)获得每位客户的利润:
df.groupby(['client'])['profit'].sum()
完成工作
2)有点棘手......我希望每个产品的每个客户看到产品对客户总利润的利润(%)。
grouped = df.groupby(['Clients','Products']).agg({'Profit': 'sum'})
grouped.groupby(level=0).apply(lambda x: 100 * x / float(x.sum()))
似乎得到了如下所示的预期结果:
Profit
Clients Products
client 1 A 68.750000
B 9.375000
C 21.875000
client 2 A 54.166667
B 16.666667
C 29.166667
client 3 B 69.230769
C 30.769231
3)现在和两个相同,但我想只看到那些说产品A的利润率为50%+且总利润超过300的客户。
Expected output here would be client 1.
任何想法如何解决这个问题?
答案 0 :(得分:1)
由于您有总和,您可以获得利润超过300的客户并将其转换为列表。找到产品的利润百分比后重置索引以选择客户端和产品。
稍后你可以根据我们之前获得的利润大于50且产品是' A' 。
sumdata = df.groupby(['Clients'])['Profit'].sum()
lst = sumdata.index[sumdata>300].tolist()
ndf = grouped.groupby(level=0).apply(lambda x: 100 * x / float(x.sum())).reset_index()
ndf[(ndf['Clients'].isin(lst)) & (ndf['Profit'].gt(50)) & (ndf['Products'] == 'A')]['Clients']
0 client 1 Name: Clients, dtype: object