【问题标题】:Add column of DataFrame based on a nested JSON in column基于列中的嵌套 JSON 添加 DataFrame 列
【发布时间】:2019-05-25 20:48:53
【问题描述】:

我有以下 Pandas 数据框(名为 dx):

                                    _id  user_type
0  {'$oid': '5b9058462f38434ab0d85cd3'}          1
1  {'$oid': '5b9058462f38434ab0d85ce9'}          1
2  {'$oid': '5b9058462f38434ab0d85ced'}          1
3  {'$oid': '5b9058462f38434ab0d85cee'}          1
4  {'$oid': '5b9058462f38434ab0d85cef'}          1

它来自一个大 JSON(比本示例更多或更少 500.000 行和更多列),您可以看到 _id 包含一个嵌套的 JSON。

对于这个例子,我的目标是获取一个名为oid 的新列,其oid 代码

                                    _id  user_type                       oid
0  {'$oid': '5b9058462f38434ab0d85cd3'}          1  5b9058462f38434ab0d85cd3
1  {'$oid': '5b9058462f38434ab0d85ce9'}          1  5b9058462f38434ab0d85ce9
2  {'$oid': '5b9058462f38434ab0d85ced'}          1  5b9058462f38434ab0d85ced
3  {'$oid': '5b9058462f38434ab0d85cee'}          1  5b9058462f38434ab0d85cee
4  {'$oid': '5b9058462f38434ab0d85cef'}          1  5b9058462f38434ab0d85cef

我使用以下sn-p实现了结果:

dx['oid']=None
for i in dx.index:
     dx['oid'][i]=dx.at[i,'_id']['$oid']

这给了我我正在寻找的东西,但它非常非常慢。填充示例的列需要 3-4 分钟,该列只有 5 行!

如何根据其他具有 JSON 值的列来优化新列的创建?

我不能使用正则表达式,因为嵌套的 JSON 是核心复杂,然后是示例中的那个。

【问题讨论】:

    标签: python json python-3.x pandas dataframe


    【解决方案1】:

    这是object 列类型,在单元格内包含单个dict,所以

    df['$oid']=df['_id'].map(lambda x : x['$oid'])
    

    或者

    s=df['_id'].apply(pd.Series)
    s
    #df=pd.concat([df,s],axis=1)
    Out[601]: 
                           $oid
    0  5b9058462f38434ab0d85cd3
    1  5b9058462f38434ab0d85ce9
    2  5b9058462f38434ab0d85ced
    3  5b9058462f38434ab0d85cee
    4  5b9058462f38434ab0d85cef
    

    【讨论】:

      【解决方案2】:

      您可以使用operator.itemgetter。由于您的输入系列具有object dtype,因此无法实现矢量化解决方案。

      from operator import itemgetter
      
      field_name = '$oid'
      df[field_name] = list(map(itemgetter(field_name), df['_id']))
      

      提供更通用的解决方案,请参阅Splitting dictionary/list inside a Pandas Column into Separate Columns

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-10
        • 2018-11-01
        • 1970-01-01
        • 2020-05-07
        • 2017-10-28
        • 2016-12-01
        • 2019-05-05
        • 2023-02-14
        相关资源
        最近更新 更多