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

时间:2016-07-31 18:02:05

标签: python pandas group-by iterable-unpacking

我想要一个名为df的Pandas Dataframe,它有一个ID列和一个列表列,列表中包含可变数量的元组,所有元组都有相同的长度。看起来像这样:

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进行转置?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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), (...