2016-07-31 66 views
4

我想要一個名爲df的Pandas Dataframe,它有一個ID列和一個list列表,列表中有可變數量的元組,列表中所有的元組都有相同的長度。看起來像這樣:Pandas - 解壓縮不同長度元組的列表

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

我想每個列表解壓到列「A」,「B」,「C」,「d」表示每個元組中的固定位置。

結果應該是這樣的:

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 

我試圖df.apply(pd.Series(list)但作爲列表元素的len是對不同行不同的失敗。不知何故需要解壓縮到列和按ID轉置?

回答

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

什麼樣的魔法的就是這個!優秀! – clg4

+0

。@ chrisb當我運行這個時,我得到了>> DataFrame構造函數沒有正確調用! – Merlin

+0

適合我。熊貓版本? – clg4

0

一個量化的方法是

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 

詳細

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), (... 
相關問題