У меня есть следующий набор данных:

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 список всех пар элементов «Company», которые соответствуют значениям в «Individual».

Например. Вывод для вышеупомянутого должен быть следующим для набора данных выше: ((A, B), (A, C), (B, C), (C, D)). первые три кортежа, поскольку Индивид 1 связан с A, B и C и последний с тех пор, как Индивид 10 связан с C и D .

Дополнительные пояснения - Если индивидуальный = 1, вышеуказанный набор данных имеет значения «A», «B» и «C». Теперь я хочу создать все уникальные комбинации этих трех значений (кортеж), поэтому он должен создать список с кортежами (A, B), (A, C) и (B, C). Следующим является Индивидуальный = 2. Здесь только имеет значение «A», поэтому нет кортежа для добавления в список. Для следующих лиц есть только одна соответствующая компания каждая, следовательно, нет дальнейших пар. Единственный другой кортеж, который должен быть добавлен, предназначен для Individual = 10, поскольку он имеет значения «C» и «D» - и поэтому должен добавить кортеж (C, D) в список.

3
Jan Ohlenbusch 28 Фев 2018 в 14:37

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: []}
1
jpp 28 Фев 2018 в 16:34

Одним из решений является использование 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']]

Это не самый эффективный способ, но он может быть интуитивно понятным.

4
jpp 28 Фев 2018 в 11:43

Попробуй это,

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

>>>1    [A, B]
>>>3    [A, C]
1
Mohamed Thasin ah 28 Фев 2018 в 11:46