【问题标题】:Find the most common combination in a DataFrame在 DataFrame 中查找最常见的组合
【发布时间】:2021-11-19 20:29:28
【问题描述】:

我正在使用 pandas,并且我试图找出一种方法来获得人们在我的数据文件中使用的最常见的产品组合。

假设接下来三个AA、BB和CC的每一列代表一个完全不同的产品,0值表示我不使用这个产品,1表示我使用它。此外,每一行代表一个完全不同的买家。

例如,在我的示例中,最常见的组合是产品 AA 和 CC,因为我有三个人使用它们,如您在第 1、4、5 行中看到的那样。

我的结果是“最常见的组合是 3 人使用的产品 AA 和 CC”。

希望这次能更好的解释给你

以下是我的 DataFrame 的示例:

AA  | BB  | CC
_______________
1   | 0   |  1
0   | 0   |  1
0   | 1   |  0
1   | 0   |  1
1   | 0   |  1

【问题讨论】:

  • 请解释为什么您的预期结果 AA CC 被认为是最好的背后的逻辑?此外,请编辑您的问题以显示一个最小的可重现集,其中包括样本输入、预期输出、实际输出以及重现问题所需的相关代码。请参阅Minimal Reproducible Example,了解如何最好地帮助我们。
  • 这能回答你的问题吗? How to count duplicate rows in pandas dataframe?
  • @wjandrea 非常感谢,但我已经尝试过与您的建议相同的方法,但正如我在问题中解释的那样,我不想得到总和或类似的东西,我需要得到名字每个客户在数据框中有 1 个列
  • @GeoP 这不是总和,而是行数。如果你不计算它们,你应该如何找到最常见的行?也就是说,这只是第一步。我会给你写一个答案。

标签: python pandas combinations


【解决方案1】:

一旦你count duplicate rows,你只需要做一些工作就可以得到相应的标签。

这就是我的做法,虽然我对 Pandas 不是很熟悉,所以可能有更好的方法。首先,df 应该是布尔值。

import pandas as pd

df = pd.DataFrame({
    'AA': [1, 0, 0, 1, 1],
    'BB': [0, 0, 1, 0, 0],
    'CC': [1, 1, 0, 1, 1]}
    ).astype(bool)

# Count duplicate rows
counts = df.groupby(df.columns.tolist()).size()
# Get most common rows
maxima = counts[counts==counts.max()]
for combination, count in maxima.iteritems():
    # Select matching labels
    labels = df.columns[list(combination)]
    print(*labels, count)

输出:

AA CC 3

部分结果:

>>> counts
AA     BB     CC   
False  False  True     1
       True   False    1
True   False  True     3
dtype: int64

>>> maxima
AA    BB     CC  
True  False  True    3
dtype: int64

【讨论】:

    【解决方案2】:

    在您回复之前,我几乎可以解决我的问题,但您 wjandrea 部分正确,所以谢谢。

    首先,我必须逐行遍历整个数据框,每次都像这样查找一个值并获得我拥有的产品名称 1。

    combination = df.apply(lambda row: row[row == 1].index.tolist(), axis=1)
    combination = pd.DataFrame(combination)
    

    之后,我创建了一个新列,其中包含每个用户使用的产品名称,我必须将喜欢的产品分开。

    df['Products'] = [' , '.join(map(str, l)) for l in combination[0]]
    

    然后我只是使用了你的代码,我得到了我想要的东西

    【讨论】:

    • 如果你要先挑名字,为什么还要使用我所有的代码呢?你可以只做counts = df.groupby('Products').size(),然后以同样的方式得到maxima
    • 顺便说一句,你为什么要做combination = pd.DataFrame(combination) 只是在之后才做combination[0]
    • 顺便说一句,使用矢量化字符串方法:df['Products'] = combination[0].str.join(' , ')
    • 我完全没有考虑你的最后一个建议,但我已经改变了,因为它更好,我也会检查你的第一个建议
    猜你喜欢
    • 2013-09-05
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    相关资源
    最近更新 更多