【问题标题】:Transform to normal Data Frame which has row as list. Split rows to column转换为具有行作为列表的普通数据框。将行拆分为列
【发布时间】:2017-01-27 08:34:48
【问题描述】:

读取复杂 json 的数据框输出如下所示。

其中单行是单列中的列表。

下面是示例数据框(df)

col
[A,1,3,4,Null]
[B,4,5,6,Null]
[C,7,8,9,Null]

我尝试使用 pandas 拆分到单个列,但它不起作用,因为单个行本身就是一个列表。 我希望数据框如下所示。

colA,colB,colC,colD,colE
A    1    3     4    Null
B    4    5     6    Null
C    7    8     9    Null

我不需要手动指定列名,它可以自动生成。

【问题讨论】:

    标签: python list pandas dataframe multiple-columns


    【解决方案1】:

    您可以使用DataFrame.from_records,但首先需要从col 列的值创建嵌套的list

    df = pd.DataFrame({'col':[['A',1,3,4,'Null'],['B',4,5,6,'Null'],['C',7,8,9,'Null']]})
    print (df)
                      col
    0  [A, 1, 3, 4, Null]
    1  [B, 4, 5, 6, Null]
    2  [C, 7, 8, 9, Null]
    
    print (df.col.values.tolist())
    [['A', 1, 3, 4, 'Null'], ['B', 4, 5, 6, 'Null'], ['C', 7, 8, 9, 'Null']]
    
    df1 = pd.DataFrame.from_records(df.col.values.tolist(), 
                                    columns=['colA','colB','colC','colD','colE'])
    
    print(df1)
      colA  colB  colC  colD  colE
    0    A     1     3     4  Null
    1    B     4     5     6  Null
    2    C     7     8     9  Null
    

    如果不需要指定列名:

    df1 = pd.DataFrame.from_records(df.col.values.tolist())
    print(df1)
       0  1  2  3     4
    0  A  1  3  4  Null
    1  B  4  5  6  Null
    2  C  7  8  9  Null
    

    时间安排

    #len(df) = 4k
    df = pd.concat([df]*1000).reset_index(drop=True)
    
    In [80]: %timeit pd.DataFrame(df['col'].apply(pd.Series).values, columns=['colA','colB','colC','colD','colE'])
    1 loop, best of 3: 753 ms per loop
    
    In [81]: %timeit pd.DataFrame.from_records(df.col.values.tolist(), columns=['colA','colB','colC','colD','colE'])
    100 loops, best of 3: 3.73 ms per loop
    

    【讨论】:

      【解决方案2】:

      您可以根据在每一行上使用 applypd.Series ctor 的结果构造一个 df:

      In [99]:
      pd.DataFrame(df['col'].apply(pd.Series).values, columns=['colA','colB','colC','colD','colE'])
      
      Out[99]:
        colA colB colC colD  colE
      0    A    1    3    4  Null
      1    B    4    5    6  Null
      2    C    7    8    9  Null
      

      【讨论】:

        猜你喜欢
        • 2021-11-17
        • 1970-01-01
        • 2013-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多