簡體   English   中英

根據Python中數據框中的條件創建包含所有唯一可能組合的列表

[英]Create list with all unique possible combination based on condition in dataframe in Python

我有以下數據集:

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)添加到列表中。

一種解決方案是使用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']]

這不是最有效的方式,但它可能是直觀的。

試試這個,

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

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

以下是您提煉問題的解決方案:

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: []}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM