【问题标题】:Grouping and computing frequency of items in Pandas PythonPandas Python中项目的分组和计算频率
【发布时间】:2021-06-01 10:34:19
【问题描述】:

假设,我有以下简单的数据框。

d = {'Date': ['20/01/2019', '21/01/2019', '20/01/2019','21/01/2019', '21/01/2019' ,'20/01/2019','21/01/2019'], 
     'Customer': ['C1' ,'C2', 'C1', 'C3', 'C1', 'C2', 'C2'], 
     'Merchant':['M1', 'M1', 'M2', 'M1','M3', 'M1','M3']}
df = pd.DataFrame(data=d)
df
Date            Customer    Merchant
20/01/2019        C1        M1
21/01/2019        C2        M1
20/01/2019        C1        M2
21/01/2019        C3        M1
21/01/2019        C1        M3
20/01/2019        C2        M1
21/01/2019        C2        M3

考虑到客户与商家的组合,我想按Date 分组。

例如,C1(客户 1)在交易中出现了 3 次,但在三个不同的商家中出现了不同的日期。我想根据日期对客户 1 的出现进行分组,并将组合放入新列 Combination。同样适用于其他客户。然后我想计算客户列出的商家 (M1, M2, and M3) 的次数。这可以通过创建列Merchant_item 及其Frequency 来完成。另外,如果一行与另一行合并,我想删除第二个重复的行,如下所示。

Date            Customer    Merchant   Combination   Merchant_item   Frequency 
20/01/2019        C1          M1         {M1, M2}       M1              3
21/01/2019        C2          M1         {M1, M3}       M2              1
21/01/2019        C3          M1         {M1}           M3              3
21/01/2019        C1          M3         {M3}
20/01/2019        C2          M3         {M3}

任何人都可以在 Python Pandas 中帮助解决这个问题吗?任何帮助表示赞赏!

【问题讨论】:

  • 查看this 进行分组。当M120/01/2019 上仅列出2 次时,您如何将M1 频率作为值3?这部分没有意义。
  • 当您看到组合列M1 出现3 次。 {M1, M2}, {M1, M3}, {M1}。只计算该特定列中的出现次数。
  • 频率计数与行中的其他数据无关。这没有任何意义。
  • 好的。你能解释一下为什么它没有意义吗?
  • 您想在第 2 行中对 M2 进行计数,但第 2 行仅包含有关 M1 和 M3 的数据。那么为什么要在第 2 行计算 M2 呢?

标签: python pandas


【解决方案1】:

这是您将初始分组到列表中的方式,以及您如何计算商家出现在分组列表中的次数。正如 cmets 中所讨论的,我认为您所需输出的结构存在问题,因此我将出现在 Merchant 元组中的每个商家的计数包括在内。

g = df.groupby(['Date','Customer']).aggregate(lambda x: tuple(x))
m = g.reset_index()['Merchant'].explode().value_counts()

count = g['Merchant'].apply(lambda x: m[m.index.isin(x)].values.tolist()).values
pd.concat([g.reset_index(), pd.Series(count, name='MerchantCount')], axis=1)

Date    Customer    Merchant    MerchantCount
0   20/01/2019  C1  (M1, M2)    [4, 1]
1   20/01/2019  C2  (M1,)       [4]
2   21/01/2019  C1  (M3,)       [2]
3   21/01/2019  C2  (M1, M3)    [4, 2]
4   21/01/2019  C3  (M1,)       [4]

参考您的评论,商家数量在变量中,m

M1    4
M3    2
M2    1
Name: Merchant, dtype: int64

【讨论】:

  • 其实这就是我最初想要得到的。你明白了我的想法。但是我们可以为组合创建一个单独的列吗?并且如果可能的话,您是否可以为每个商家单独添加额外的数据框以从当前数据框获取信息? ``` Merchant_count M1 4 ``` 其余相同。
  • 商户数量在变量m中。
猜你喜欢
  • 2014-06-17
  • 2015-06-20
  • 2021-08-19
  • 2018-05-30
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
相关资源
最近更新 更多