【问题标题】:Explode column of lists into multiple columns将列表的列分解为多列
【发布时间】:2018-10-20 05:44:26
【问题描述】:

我有一个 pandas 系列,其中包含每个元素的数组,如下所示:

0            [0, 0]
1          [12, 15]
2          [43, 45]
3           [9, 10]
4            [0, 0]
5            [3, 3]
6            [0, 0]
7            [0, 0]
8            [0, 0]
9            [3, 3]
10           [2, 2]

我想提取所有第一个元素,将它们放在另一个系列或列表中,并对第二个元素执行相同的操作。 我试过做正则表达式:

mySeries.str.extract(r'\[(\d+), (\d+)\]', expand=True)

还有分裂:

mySeries.str.split(', ').tolist())

两者都给出nan 值。我做错了什么?

【问题讨论】:

    标签: python list pandas dataframe


    【解决方案1】:

    一种解决方案是将pd.DataFrame.applypd.Series 一起使用。这假设您有一系列列表,正如您的问题所暗示的那样,而不是字符串。

    您的逻辑不适用于一系列列表,因为这些列表在 pandas 中没有表示为字符串。

    df = pd.DataFrame({'A': [[1, 2], [3, 4], [5, 6]]})
    
    df[['B', 'C']] = df['A'].apply(pd.Series)
    
    print(df)
    
            A  B  C
    0  [1, 2]  1  2
    1  [3, 4]  3  4
    2  [5, 6]  5  6
    

    【讨论】:

    • 应该注意apply + Series 在性能方面是天作之合。 OP的头痛,我背上的皮肤少了:p
    【解决方案2】:

    案例 1
    列表列
    您需要 .tolist 该列并将其加载到 DataFrame 中。

    pd.DataFrame(df['col'].tolist())
    

    df
             col
    0     [0, 0]
    1   [12, 15]
    2   [43, 15]
    3    [9, 10]
    4     [0, 0]
    5     [3, 3]
    6     [0, 0]
    7     [0, 0]
    8     [0, 0]
    9     [3, 3]
    10    [2, 2]
    
    pd.DataFrame(df['col'].tolist())
    
         0   1
    0    0   0
    1   12  15
    2   43  15
    3    9  10
    4    0   0
    5    3   3
    6    0   0
    7    0   0
    8    0   0
    9    3   3
    10   2   2
    

    注意:如果您的数据有 NaN,我建议您先删除它们:df = df.dropna(),然后按照上图所示继续操作。


    案例 2
    表示为列表的字符串列

    如果您有

    df['col'] = pd.eval(df['col'])
    

    然后实现案例1,否则使用ast:

    import ast
    df['col'] = df['col'].apply(ast.literal_eval)
    

    然后像以前一样继续。

    【讨论】:

      【解决方案3】:

      zipdf.col的元素

      df.assign(**dict(zip('AB', zip(*df.col))))
      
               col   A   B
      0     [0, 0]   0   0
      1   [12, 15]  12  15
      2   [43, 45]  43  45
      3    [9, 10]   9  10
      4     [0, 0]   0   0
      5     [3, 3]   3   3
      6     [0, 0]   0   0
      7     [0, 0]   0   0
      8     [0, 0]   0   0
      9     [3, 3]   3   3
      10    [2, 2]   2   2
      

      或者

      df['A'], df['B'] = zip(*df.col)
      df
      
               col   A   B
      0     [0, 0]   0   0
      1   [12, 15]  12  15
      2   [43, 45]  43  45
      3    [9, 10]   9  10
      4     [0, 0]   0   0
      5     [3, 3]   3   3
      6     [0, 0]   0   0
      7     [0, 0]   0   0
      8     [0, 0]   0   0
      9     [3, 3]   3   3
      10    [2, 2]   2   2
      

      【讨论】:

        猜你喜欢
        • 2018-08-15
        • 2022-01-09
        • 1970-01-01
        • 2016-12-04
        • 1970-01-01
        • 2016-05-31
        • 1970-01-01
        相关资源
        最近更新 更多