我有以下熊猫数据框(名为$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更复杂。
答案 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。