高级python / pandas透视和过滤?

时间:2017-09-16 15:54:47

标签: python pandas

我有一个数据集,其中包含客户信息,他们花钱的产品以及他们花了多少钱。 即。

  • client_name:string
  • 产品:[A,B,C]
  • profit:float
看起来像这样:

    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.

任何想法如何解决这个问题?

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