2016-12-02 3 views
1

Ich habe ein Pandas DataFrame, und die Werte einer Spalte, die ich verwenden möchte, sind Listen. Ich möchte zwei Elemente nacheinander in jeder Liste kombinieren und in einen anderen Datenrahmen ausgeben.
Zum Beispiel habe ich Datenrahmen df, die col_a und col_b enthält. Die Werte von col_b sind Listen. Ich möchte Werte von df.col_b loopen, eine gepaarte Liste ausgeben.Pandas Loop-Spalte Werte

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] 

Ich möchte dies:

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] 

Antwort

1

Angenommen, Ihre col_a hat eindeutigen Wert pro Zeile können Sie combinations von itertools verwenden, um alle zwei Kombinationen des Listenelement zu generieren:

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

Sie können itertools verwenden, um die Listen zu reduzieren:

Die Serie muss einen Namen mit der „Mutter“ Datenrahmen zusammenführbar sein müssen:

series.name = "col_b_1" 

Nun verschmelzen die beiden Datenobjekte und wählen Sie die Spalten, die Sie wollen:

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

Das Ergebnis ist eine Tupelspalte; Wenn das nicht ok ist, .apply() Funktion list() zu ihm.

# 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)