【问题标题】:Pandas: Splitting JSON list value into new columnsPandas:将 JSON 列表值拆分为新列
【发布时间】:2018-03-05 09:50:55
【问题描述】:

我使用 Pandas 将 CSV 加载到以下 DataFrame:

      value                                  values                                   
0        56.0             [-0.5554548,10.0748005,4.232949]                          
1        72.0         [-0.1953888,0.15093994,-0.058532715] 
...

现在我想用 3 个新列替换“值”列,如下所示:

     value     values_a      values_b      values_c                                      
0     56.0    -0.5554548    10.0748005     4.232949                          
1     72.0    -0.1953888    0.15093994    -0.058532715 
    ...

如何将列表拆分为 3 列?

【问题讨论】:

    标签: python json pandas dataframe


    【解决方案1】:

    您可以使用split 删除[] by strip

    df1 = df.pop('values').str.strip('[]').str.split(',',expand=True).astype(float)
    df[['values_a', 'values_b', 'values_c']] = df1
    

    没有NaNs的解决方法:

    L = [x.split(',') for x in df.pop('values').str.strip('[]').values.tolist()]
    df[['values_a', 'values_b', 'values_c']] = pd.DataFrame(L).astype(float)
    

    先将列转换为列表然后使用DataFrame构造函数的解决方案:

    import ast
    s = df.pop('values').apply(ast.literal_eval)
    df[['values_a', 'values_b', 'values_c']] = pd.DataFrame(s.values.tolist()).astype(float)
    

    类似的:

    df = pd.read_csv(file converters={'values':ast.literal_eval})
    print (df)
       value                                  values
    0   56.0      [-0.5554548, 10.0748005, 4.232949]
    1   72.0  [-0.1953888, 0.15093994, -0.058532715]
    
    df1 = pd.DataFrame(df.pop('values').tolist()).astype(float)
    df[['values_a', 'values_b', 'values_c']] = df1
    

    决赛

    print (df)
       value  values_a   values_b  values_c
    0   56.0 -0.555455  10.074801  4.232949
    1   72.0 -0.195389   0.150940 -0.058533
    

    编辑:

    如果在某些列中可能超过 3 个值,则不可能分配给 3 个新列。解决方案是使用join:

    df = df.join(df1.add_prefix('val'))
    print (df)
       value      val0       val1      val2
    0   56.0 -0.555455  10.074801  4.232949
    1   72.0 -0.195389   0.150940 -0.058533
    

    【讨论】:

    • @ShlomiSchwartz - 这意味着有更多的, 作为 2,所以最终的 DataFrame 有更多的列作为 3。
    猜你喜欢
    • 1970-01-01
    • 2019-01-09
    • 2023-01-11
    • 2023-02-17
    • 2016-05-31
    • 2020-02-10
    • 2021-01-24
    相关资源
    最近更新 更多