2016-12-02 3 views
1

У меня есть pandas DataFrame, и значения одного столбца, которые я хочу использовать, - это списки. Я хочу объединить два элемента по одному из каждого списка и вывести их в другой DataFrame.
Например, у меня есть dataframe df, который содержит col_a и col_b. Значения col_b - это списки. Я хочу задать значения df.col_b, вывести парные списки.Значения столбца цикла pandas

import pandas as pd 

df=pd.DataFrame({'col_a':['ast1','ast2','ast3'],'col_b':[['text1','text2','text3'],['mext1','mext2','mext3'],['cext1','cext2']]}) 
df 

    col_a col_b 
0 ast1 [text1, text2, text3] 
1 ast2 [mext1, mext2, mext3] 
2 ast3 [cext1, cext2] 

Я хочу это:

col_a col_b_1 
0 ast1 [text1, text2] 
1 ast1 [text1, text3] 
2 ast1 [text2, text3] 
3 ast2 [mext1, mext2] 
4 ast2 [mext1, mext3] 
5 ast2 [mext2, mext3] 
6 ast3 [cext1, cext2] 

ответ

1

Предполагая, что ваш col_a имеет уникальное значение для каждой строки, вы можете использовать combinations от itertools генерировать все две комбинации списка элемента:

from itertools import combinations 
(df.groupby('col_a')['col_b'] 
    .apply(lambda x: pd.Series(list(combinations(x.iloc[0], 2)))) 
    .reset_index(level = 0)) 

# col_a   col_b 
#0 ast1 (text1, text2) 
#1 ast1 (text1, text3) 
#2 ast1 (text2, text3) 
#0 ast2 (mext1, mext2) 
#1 ast2 (mext1, mext3) 
#2 ast2 (mext2, mext3) 
#0 ast3 (cext1, cext2) 
1

Вы можете использовать itertools, чтобы сгладить списки:

import itertools 
series = df["col_b"].apply(lambda x: \ 
    pd.Series(list(itertools.combinations(x,2)))).stack() 

серии должен иметь имя, чтобы быть объединяемы с «мать» dataframe:

series.name = "col_b_1" 

Теперь объединить два объекта данных и выберите столбцы, которые вы хотите:

result = df.merge(pd.DataFrame(series).reset_index(), 
    left_index=True, 
    right_on="level_0")[["col_a","col_b_1"]] 

Результатом является столбец кортежей; если это не нормально, .apply() функция list().

# col_a   col_b_1 
# 0 ast1 (text1, text2) 
# 1 ast1 (text1, text3) 
# 2 ast1 (text2, text3) 
# 3 ast2 (mext1, mext2) 
# 4 ast2 (mext1, mext3) 
# 5 ast2 (mext2, mext3) 
# 6 ast3 (cext1, cext2) 
Смежные вопросы