gpt4 book ai didi

python - 将 Pandas 数据帧中的 JSON 数据转换为数据帧本身的最佳方法

转载 作者:行者123 更新时间:2023-11-28 20:55:41 24 4
gpt4 key购买 nike

我有一个 Pandas 数据框,其中一列在每一行中包含一个非嵌套的 json 对象。

                             js
0 {"k1":"1","k2":"A","k3":"X"}
1 {"k1":"2","k2":"B","k3":"X"}
2 {"k1":"3","k2":"A","k3":"Y"}
3 {"k1":"4","k2":"D","k4":"M"}

这样创建的:

import pandas as pd
L0 = ['{"k1":"1","k2":"A","k3":"X"}',
'{"k1":"2","k2":"B","k3":"X"}',
'{"k1":"3","k2":"A","k3":"Y"}',
'{"k1":"4","k2":"D","k4":"M"}']
df = pd.DataFrame({'js':L0})

我想将 json 对象制作成它们自己的数据框:

  k1 k2   k3   k4
0 1 A X NaN
1 2 B X NaN
2 3 A Y NaN
3 4 D NaN M

现在我知道的唯一方法是使用 json 模块和 df.iterrows():

import json
all_json = []
for _,row in df.iterrows():
all_json.append(json.loads(row["js"]))
df2 = pd.DataFrame.from_dict(all_json)

有没有更好的方法来做到这一点,最好不需要迭代?

编辑 1:

感谢您的回答。

我在我的真实世界数据上使用 ast.literal_eval 对三种建议的方法进行了计时,我自己的方法需要 158 ms ± 4.01 ms:

df = df.apply(lambda x: ast.literal_eval(x[0]), 1).apply(pd.Series) 需要 640 ms ± 7.8 ms

df['js'].apply(ast.literal_eval).apply(pd.Series) 耗时 636 毫秒 ± 19 毫秒

pd.DataFrame(df.js.apply(ast.literal_eval).tolist()) 需要 180 毫秒 ± 5.11

正如建议的那样,第三种方法是最快的,但遗憾的是它们都比 iterrows 方法慢,而我的意图是摆脱 iterrows 以使其更快.

编辑 2:pd.DataFrame(df["js"].apply(json.loads).tolist()) 需要 25.2 ms ± 512 µs 所以我猜我们有一个赢家。

最佳答案

使用ast.literal_eval并申请pd.Series作为:

import ast
df = df.apply(lambda x: ast.literal_eval(x[0]), 1).apply(pd.Series)

print(df)
k1 k2 k3 k4
0 1 A X NaN
1 2 B X NaN
2 3 A Y NaN
3 4 D NaN M

或者:

df = pd.DataFrame([ast.literal_eval(i) for i in df['js']])

或者:

import json
df = pd.DataFrame([json.loads(i) for i in df['js']])

关于python - 将 Pandas 数据帧中的 JSON 数据转换为数据帧本身的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56106811/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com