2016-07-31 7 views
4

Ich würde gerne ein Pandas Dataframe namens df, die eine ID-Spalte und eine Liste Spalte von Listen, die variable Anzahl von Tupeln, alle Tupel haben die gleiche Länge haben nehmen. Sieht wie folgt aus:Pandas - Entpacken Spalte von Listen mit unterschiedlichen Längen von Tupeln

ID list 
1 [(0,1,2,3),(1,2,3,4),(2,3,4,NaN)] 
2 [(Nan,1,2,3),(9,2,3,4)] 
3 [(Nan,1,2,3),(9,2,3,4),(A,b,9,c),($,*,k,0)] 

Und ich möchte jede Liste in Spalten ‚A‘ entpacken, ‚B‘, ‚C‘, ‚D‘, um die festen Positionen in jedem Tupel darstellt.

sollte das Ergebnis wie folgt aussehen:

ID A B C D 
1 0 1 2 3 
1 1 2 3 4 
1 2 3 4 NaN 
2 NaN 1 2 3 
2 9 2 3 4 
3 NaN 1 2 3 
3 9 2 3 4 
3 A b 9 c 
3 $ * k 0 

ich df.apply(pd.Series(list) versucht haben, nicht aber als die len der Listenelemente unterschiedlich auf verschiedenen Reihen ist. Irgendwie müssen in Spalten entpacken und per ID transponieren?

Antwort

4
In [38]: (df.groupby('ID')['list'] 
      .apply(lambda x: pd.DataFrame(x.iloc[0], columns=['A', 'B', 'C', 'D'])) 
      .reset_index()) 
Out[38]: 
    ID level_1 A B C D 
0 1  0 0 1 2 3 
1 1  1 1 2 3 4 
2 1  2 2 3 4 NaN 
3 2  0 NaN 1 2 3 
4 2  1 9 2 3 4 
5 3  0 NaN 1 2 3 
6 3  1 9 2 3 4 
7 3  2 A b 9 c 
8 3  3 $ * k 0 
+0

Welche Art von Zauberei ist dies sein würde! Ausgezeichnet! – clg4

+0

. @ Chrisb Wenn ich das ausführen bekomme ich >> DataFrame Konstruktor nicht richtig aufgerufen! – Merlin

+0

Funktioniert perfekt für mich. Version von Pandas? – clg4

0

Eine vektorisierte Weg

In [2237]: dff = pd.DataFrame(np.concatenate(df['list'].values), columns=list('ABCD')) 

In [2238]: dff['ID'] = df.ID.repeat(df['list'].str.len()).values 

In [2239]: dff 
Out[2239]: 
    A B C D ID 
0 0.0 1.0 2.0 3.0 1 
1 1.0 2.0 3.0 4.0 1 
2 2.0 3.0 4.0 nan 1 
3 nan 1.0 2.0 3.0 2 
4 9.0 2.0 3.0 4.0 2 
5 nan 1 2 3 3 
6 9 2 3 4 3 
7 A b 9 c 3 
8 $ * k 0 3 

Einzelheiten

In [2240]: df 
Out[2240]: 
    ID            list 
0 1  [(0, 1, 2, 3), (1, 2, 3, 4), (2, 3, 4, nan)] 
1 2      [(nan, 1, 2, 3), (9, 2, 3, 4)] 
2 3 [(nan, 1, 2, 3), (9, 2, 3, 4), (A, b, 9, c), (...