【问题标题】:Find permutations in a huge pandas dataframe?在巨大的 pandas 数据框中找到排列?
【发布时间】:2017-09-18 08:45:49
【问题描述】:

我有一个相当大的数据框,基本上如下所示:

df_apple = pd.DataFrame({'_id': ['A','B' ,'C'], 'apple': ['1', '0', '1'], 'orange': ['1', '1', '0'],  'kiwi': ['1', '0', '1']})

我有每个_id 具有特征和二进制分类的列。我正在尝试为appleorangekiwi 的每个排列/组合找到所有个体 (_id) 的频率和总数。这类似于这个问题here

在这个玩具箱中,appleorangekiwi 的组合出现了一次 (_id == A),而apple == 0 & orange==1 & kiwi==0 的组合则根本不出现。

我正在尝试创建一个应包含以下信息的输出:

df_combination = pd.DataFrame({'_id': ['Apple, Orange and Kiwi','Only Orange' ,'Apple and Kiwi but not Orang'], 'Count': ['1', '1', '1']})

即一个数据框告诉我,找到哪种组合以及频率。我对根本不出现的组合不感兴趣。

但是,我的数据框大约有 300 列。我无法先验地指定它们,并且通过计算解决这将需要很长时间。任何想法如何以一种好的方式解决这个问题?

【问题讨论】:

  • 你知道300有多大吗!是?
  • 您是否正在尝试构建association rules
  • 我认为您实际上想要组合,或者一般的子集。有 2^300 种可能性,这仍然太多了,但它与排列不一样......你需要的结果到底是什么?任何给定的列子集出现的次数?
  • @Rachel 您只想计算每个排列的数量吗?你希望这个数据框的输出是什么,你能澄清一下吗?

标签: python-3.x pandas permutation


【解决方案1】:

看看这是否符合您的需求:

import pandas as pd

df_apple = pd.DataFrame({'_id':    ['A', 'B', 'C'],
                         'apple':  ['1', '0', '1'],
                         'orange': ['1', '1', '0'],
                         'kiwi':   ['1', '0', '1']})

df_counts = df_apple.groupby(by=tuple(df_apple.columns[1:])).count()
idx_str = [[df_counts.index.names[i] for i, v in enumerate(idx) if v != '0']
           for idx in df_counts.index]
idx_str = [" and ".join((", ".join(s[:-1]), s[-1])) if len(s) > 1 else s[0] for s in idx_str]
df_counts.index = idx_str
df_counts.columns = ["count"]
df_counts = df_counts.T

print(df_counts)
>>>        orange  apple and kiwi  apple, kiwi and orange
    count       1               1                       1

【讨论】:

  • 这已经很有用了,但没有给我想要的输出。我可以创建一个表格来显示所有子集以及自动找到它们的频率吗?
  • 谢谢!这看起来很完美!
猜你喜欢
  • 2020-04-30
  • 2018-05-29
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-18
相关资源
最近更新 更多