python - 从 csv 文件 python 解析一个字典
问题描述
我正在从 csv 文件中读取数据,例如:
import pandas as pd
data_1=pd.read_csv("sample.csv")
data_1.head(10)
它有两列:
ID detail
1 [{'a': 1, 'b': 1.85, 'c': 'aaaa', 'd': 6}, {'a': 2, 'b': 3.89, 'c': 'bbbb', 'd': 10}]
详细信息列不是 json,但它是 dict,我想展平 dict 并希望结果如下:
ID a b c d
1 1 1.85 aaaa 6
1 2 3.89 bbbb 10
我总是在详细信息列中得到 a,b,c,d 并希望将最终结果移动到 sql 表中。
有人可以帮助我如何解决它。
解决方案
使用字典理解和ast.literal
for 将字符串 repr 转换为 dicts 列表并将其转换为DataFrame
,然后使用concat
并将第一级转换MultiIndex
为ID
列:
import ast
d = {i: pd.DataFrame(ast.literal_eval(d)) for i, d in df[['ID','detail']].to_numpy()}
#for oldier pandas version use .values
#d = {i: pd.DataFrame(ast.literal_eval(d)) for i, d in df[['ID','detail']].values)}
df = pd.concat(d).reset_index(level=1, drop=True).rename_axis('ID').reset_index()
print (df)
ID a b c d
0 1 1 1.85 aaaa 6
1 1 2 3.89 bbbb 10
或者将 lsit 理解与DataFrame.assign
forID
列一起使用,只需要更改列的顺序 - 最后一列到第一列:
import ast
L = [pd.DataFrame(ast.literal_eval(d)).assign(ID=i) for i, d in df[['ID','detail']].to_numpy()]
#for oldier pandas versions use .values
#L = [pd.DataFrame(ast.literal_eval(d)).assign(ID=i) for i, d in df[['ID','detail']].values]
df = pd.concat(L, ignore_index=True)
df = df[df.columns[-1:].tolist() + df.columns[:-1].tolist()]
print (df)
ID a b c d
0 1 1 1.85 aaaa 6
1 1 2 3.89 bbbb 10
编辑:
对于 2 个 ID 更改第二个解决方案:
d = [pd.DataFrame(ast.literal_eval(d)).assign(ID1=i1, ID2=i2) for i1, i2, d in df[['ID1','ID2','detail']].to_numpy()]
df = pd.concat(d)
df = df[df.columns[-2:].tolist() + df.columns[:-2].tolist()]
推荐阅读
- android - 如何在android中实现外部指纹设备SDK?
- stored-procedures - 在 Kentico 中使用带有自定义查询的中继器执行存储过程
- c# - 如何在 .NET Core 2.1 中使用 Identity Server?
- android - 发布处理程序时显示敬酒
- wix - wix Restart Manager 成功关闭应用程序但说它不能
- javascript - 如何在数组中的全名后添加逗号?
- java - 在 JDBC for PostgreSQL 中,我可以执行 psql 的命令吗?
- c# - 创建具有 Nullable 等行为的 C# 类或结构
- vba - 在 UDF 中处理可选参数的最佳方法是什么?
- alexa - 如何为 Alexa Skill 扩展自定义插槽类型?