Получить все возможные пары внутри ячейки в df python

#python #python-3.x #pandas #dataframe

#python #python-3.x #панды #фрейм данных

Вопрос:

У меня есть df, такой как :

 COL1 COL2 COL3
G1   1    ['B_-__Canis_lupus']
G1   2    ['A_-__Felis_cattus','O_ __Felis_cattus','D_-__Felis_sylvestris]
G2   1    ['Q_-__Mus_musculus','S_-__Mus_griseus','P_-__Mus_rattus']
 

и я хотел бы из этого создать 1 новый столбец :

COL4, который представляет собой всю попарно возможную комбинацию COL3, содержит (без против себя) и в виде списка списка внутри ячеек

Здесь я должен затем получить :

 COL1 COL2 COL3 COL4
G1   1    ['B_-__Canis_lupus'] NA 
G1   2    ['A_-__Felis_cattus','O_ __Felis_cattus','D_-__Felis_sylvestris'] [['A_-__Felis_cattus','O_ __Felis_cattus'],['A_-__Felis_cattus','D_-__Felis_sylvestris'];['O_ __Felis_cattus','D_-__Felis_sylvestris']] 
G2   1    ['Q_-__Mus_musculus','S_-__Mus_griseus','P_-__Mus_rattus'] [['Q_-__Mus_musculus','S_-__Mus_griseus'],['Q_-__Mus_musculus','P_-__Mus_rattus'],['S_-__Mus_griseus','P_-__Mus_rattus']]
 

у кого-нибудь есть идея?

вот данные в формате dic :

    data= {'COL1': {0: 'G1', 1: 'G1', 2: 'G2'}, 'COL2': {0: 1, 1: 2, 2: 1}, 'COL3': {0: "['B_-__Canis_lupus']", 1: "['A_-__Felis_cattus','O_ __Felis_cattus','D_-__Felis_sylvestris']", 2: "['Q_-__Mus_musculus','S_-__Mus_griseus','P_-__Mus_rattus']"}}
 

Я использую :

 import pandas as pd 
df=pd.read_csv("test.tab",sep=";")
 

или

 pd.DataFrame.from_dict(data)
 

Комментарии:

1. как вы импортируете данные? Как фрейм данных pandas? Очень важно указать, какие пакеты вы используете (для получения дополнительной помощи).

2. @HansT Я обновил сообщение, спасибо

3. вероятно , вы можете использовать df.apply() вместе с from itertools import combinations .

Ответ №1:

Использовать itertools.combinations . COL3 Столбец содержит список в виде строки , в которую требуется literal_eval преобразовать list .

 from itertools import combinations
from ast import literal_eval

def all_combinations(x):
    return [list(combinations(x, i)) for i in range(1, 3)]

df['COL3'] = df.COL3.map(literal_eval)
df['COL3'] = df.COL3.map(all_combinations)
 

Комментарии:

1. Спасибо, но я получаю такой результат, как : [[([,), (',), (B,), (_,), (-,), (_,), (_,), (C … для COL3 … Кажется, он принимает каждый элемент как i вместо просто «разделенного содержимого»

2. Можем ли мы создать новый COL4 вместо перезаписи COL3? Я имею в виду, что в COL3 есть первый список, а затем пары, я хотел бы иметь в COL4 только пары и значения NA, когда в списке есть только один элемент