根据列中的嵌套JSON添加DataFrame列

时间:2018-12-27 22:33:55

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

我有以下熊猫数据框(名为$sql = sprintf("SELECT * FROM mitglieder where id > %d limit 1", $id);):

dx

它来自一个大型JSON(此示例中大约有500.000行和更多的列),就像您看到的 _id user_type 0 {'$oid': '5b9058462f38434ab0d85cd3'} 1 1 {'$oid': '5b9058462f38434ab0d85ce9'} 1 2 {'$oid': '5b9058462f38434ab0d85ced'} 1 3 {'$oid': '5b9058462f38434ab0d85cee'} 1 4 {'$oid': '5b9058462f38434ab0d85cef'} 1 包含嵌套的JSON。

在此示例中,我的目标是使用 oid代码 获得一个名为_id的新列:

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

这给了我我想要的东西,但是非常慢。该示例的列(仅5行)需要3-4分钟!

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

我不能使用正则表达式,因为嵌套JSON比示例中的JSON更复杂。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

您可以使用operator.itemgetter。由于您的输入序列的dtype为object,因此无法进行矢量化解决方案。

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