Pandas - 解压缩不同长度元组的列表

问题描述:

我想要一个名为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转置?

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

一个量化的方法是

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), (...