【问题标题】:Pandas - Unpack column of lists of varying lengths of tuplesPandas - 解压不同长度的元组列表的列
【发布时间】:2016-12-05 19:54:50
【问题描述】:

我想要一个名为df 的 Pandas 数据框,它有一个 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 转置?

【问题讨论】:

    标签: python pandas group-by iterable-unpacking


    【解决方案1】:
    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
    

    【讨论】:

    • 这是什么魔法!太棒了!
    • .@chrisb 当我运行它时,我得到 >> DataFrame 构造函数没有正确调用!
    • 非常适合我。熊猫的版本?
    【解决方案2】:

    矢量化的方式是

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

    【讨论】:

      猜你喜欢
      • 2018-02-03
      • 1970-01-01
      • 2021-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多