【问题标题】:Create list with all unique possible combination based on condition in dataframe in Python根据Python中数据框中的条件创建具有所有唯一可能组合的列表
【发布时间】:2018-08-08 06:44:10
【问题描述】:

我有以下数据集:

d = {
'Company':['A','A','A','A','B','B','B','B','C','C','C','C','D','D','D','D'],
'Individual': [1,2,3,4,1,5,6,7,1,8,9,10,10,11,12,13]
}

现在,我需要在 Python 中创建一个列表,其中包含“公司”的所有元素对,它们对应于“个人”中的值。

例如对于上述数据集,上述输出应如下所示: ((A,B),(A,C),(B,C),(C,D))。前三个元组,因为个体 1 隶属于 A、B 和 C最后一个,个人 10 隶属于 C 和 D

进一步解释 - 如果 individual =1,则上述数据集具有“A”、“B”和“C”值。现在,我想创建这三个值(元组)的所有唯一组合,因此它应该创建一个包含元组(A,B),(A,C)和(B,C)的列表。接下来是个人=2。这里只有值'A',因此没有要附加到列表的元组。对于接下来的个人,每个人只有一个对应的公司,因此没有其他配对。唯一需要添加的其他元组是 Individual=10,因为它具有值 'C' 和 'D' - 因此应该将元组 (C,D) 添加到列表中。

【问题讨论】:

  • 你能澄清一下“'Company' 如果 Individual=1 的所有组合”
  • 当然可以。如果 individual =1,则上述数据集只有“A”和“B”值。现在,我想创建这两个值(元组)的所有唯一组合,因此它应该使用元组(A,B)创建一个列表。接下来是个人=2。这里只有值'A',因此没有要附加到列表的元组。接下来是个人“3”,其公司值为“A”和“C”。因此它应该将 (A,C) 添加到列表中。等等。
  • @JanOhlenbusch,我为细化问题添加了单独的答案。

标签: python pandas numpy dictionary combinations


【解决方案1】:

一种解决方案是使用pandas:

import pandas as pd

d = {'Company':['A','A','A','B','B','B','C','C','C'],'Individual': [1,2,3,1,4,5,3,6,7]}

df = pd.DataFrame(d).groupby('Individual')['Company'].apply(list).reset_index()
companies = df.loc[df['Company'].map(len)>1, 'Company'].tolist()

# [['A', 'B'], ['A', 'C']]

这不是最有效的方法,但它可能很直观。

【讨论】:

  • 非常感谢!这已经接近我正在寻找的 - 我认为我对输出不够清楚 - 因为您的解决方案为每个人提供了 n 元组。我需要每个人的所有双(2)元组组合并将它们添加到列表中。 (我需要根据隶属关系创建一个可以在networkX中处理的边缘列表)。我相信 itertools 模块中有一种方法,使用组合迭代器 - 但是我仍然卡住了..
  • @JanOhlenbusch,您能否提供具有代表性的示例数据(输入和输出)来满足您的新需求?
  • 谢谢,我更新了问题。我已经找到了一个可能的解决方案,作为您部分的扩展(见下文)。不确定它是否是最干净或最有效的解决方案。我们有一个包含 1-2 百万个条目的最终数据集,不确定 RAM 是否足够。 import itertools as itedgeList = []for x in companies: pairs = list(it.combinations(x, 2)) edgeList.extend(pairs)
【解决方案2】:

试试这个,

temp=df[df.duplicated(subset=['Individual'],keep=False)]
print temp.groupby(['Individual'])['Company'].unique()

>>>1    [A, B]
>>>3    [A, C]

【讨论】:

    【解决方案3】:

    这是您提炼问题的解决方案:

    from collections import defaultdict
    from itertools import combinations
    
    data = {'Company':['A','A','A','A','B','B','B','B','C','C','C','C','D','D','D','D'],
            'Individual': [1,2,3,4,1,5,6,7,1,8,9,10,10,11,12,13]}
    
    d = defaultdict(set)
    
    for i, j in zip(data['Individual'], data['Company']):
        d[i].add(j)
    
    res = {k: sorted(map(sorted, combinations(v, 2))) for k, v in d.items()}
    
    # {1: [['A', 'B'], ['A', 'C'], ['B', 'C']],
    #  2: [],
    #  3: [],
    #  4: [],
    #  5: [],
    #  6: [],
    #  7: [],
    #  8: [],
    #  9: [],
    #  10: [['C', 'D']],
    #  11: [],
    #  12: [],
    #  13: []}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-06
      • 2021-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多