python-3.x - 将 panda 数据框列从字典数据形式解析为每个字典键的新列

标签 python-3.x pandas parsing

在Python 3中,pandas。假设有一个带有 x 列的数据框 df

df=pd.DataFrame(
[
{'x':'{"a":"1","b":"2","c":"3"}'},
{'x':'{"a":"2","b":"3","c":"4"}'}
]
)

列 x 包含看起来像字典的数据。想知道如何将它们解析为新的数据框,以便这里的每个键都成为一个新列?

所需的输出数据帧类似于

x,a,b,c
'{"a":"1","b":"2","c":"3"}',1,2,3
'{"a":"2","b":"3","c":"4"}',2,3,4

本文中的解决方案似乎都不适用于这种情况

parsing a dictionary in a pandas dataframe cell into new row cells (new columns)

df1=pd.DataFrame(df.loc[:,'x'].values.tolist())

print(df1)

结果相同的数据帧。没有将列分成每列的每个键

有2美分吗? 谢谢!

最佳答案

您还可以映射 json.loads 并转换为数据帧,例如;

import json
df1 = pd.DataFrame(df['x'].map(json.loads).tolist(),index=df.index)
print(df1)

   a  b  c
0  1  2  3
1  2  3  4

此测试比通过 ast 进行评估更快,以下是 40K 行的基准:

m = pd.concat([df]*20000,ignore_index=True)

%%timeit
import json
df1 = pd.DataFrame(m['x'].map(json.loads).tolist(),index=m.index)
#256 ms ± 18.5 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

%%timeit
import ast
df1 = pd.DataFrame(m['x'].map(ast.literal_eval).tolist(),index=m.index)
#1.32 s ± 136 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%%timeit
import ast
df1 = pd.DataFrame(m['x'].apply(ast.literal_eval).tolist(),index=m.index)
#1.34 s ± 71.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

关于python-3.x - 将 panda 数据框列从字典数据形式解析为每个字典键的新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60912050/

相关文章:

python - Pandas 合并数据帧并覆盖原始 df 中的数据

java - 解析Java中的未知对象

python - 将返回的元组分配给数组的不同列

python - Pathlib 使用 Path.parents 访问 Path 时出错

python - 将 float 转换为美元和美分

mysql - 为什么我们必须在插入数据库之前解析日期?

Java - 提取方括号内的内容(忽略嵌套的方括号)?

python - 试图理解为什么只在第一次调用嵌套 for 循环

python-3.x - 按列名拼接 Pandas 数据框

用于创建可点击链接的Python代码抛出错误