#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, когда в списке есть только один элемент