我有以下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

我使用以下代码片段获得了结果:
dx['oid']=None
for i in dx.index:
     dx['oid'][i]=dx.at[i,'_id']['$oid']

这给了我我正在寻找的,但它是非常缓慢的。填充示例中只有5行的列需要3-4分钟!
如何根据具有JSON值的其他列优化新列的创建?
我不能使用regex,因为嵌套的JSON比示例中的JSON核心复杂。

最佳答案

这是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

09-10 01:20
查看更多