从csv文件python解析dict

从csv文件python解析dict,python,pandas,dictionary,parsing,flatten,Python,Pandas,Dictionary,Parsing,Flatten,我正在从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}] detail列不是json,而是dict,我想将dict展平,并希望得到如下结果: ID a b

我正在从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}]
detail列不是json,而是dict,我想将dict展平,并希望得到如下结果:

ID  a   b     c     d
1   1   1.85  aaaa  6
1   2   3.89  bbbb  10
我总是在detail列中得到a、b、c、d,并希望将最终结果移动到sql表中


有人能帮我解决这个问题吗。

使用字典理解和
ast.literal
将字符串repr转换为dict列表,并将其转换为
DataFrame
,然后使用
多索引的第一级将其转换为
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理解与for
ID
列一起使用,仅列的必要变更顺序-从最后一列到第一列:

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()]

我得到的错误类似于“DataFrame”对象没有属性“to_numpy”@xhang-答案已编辑,需要
而不是
。to_numpy()
谢谢jezrael,但它抛出错误TypeError:“numpy.ndarray”对象不是callable@xhang-是否使用
.values
而不使用
()
?很酷,非常感谢,它就像一个符咒,只是一个后续问题假设我有两把钥匙,你能帮助我在这里做些什么吗df[['ID1','ID2','detail']