Python 数据框列中的词典列表
我在Python 数据框列中的词典列表,python,json,list,Python,Json,List,我在DataFrame中有一列,其中包含JSON字符串,每个字符串表示一个字典列表: id Number Type Class Name
DataFrame
中有一列,其中包含JSON字符串,每个字符串表示一个字典列表:
id Number Type Class Name datiles
0 292 C 1 2 A [{"did":{"id":"3","num":1},"NId":"a1,b1,c1","Att":null,"isnull":false,"number":"M90","label":[{"title":"Dear","Info":{"Id":null,"id2":2,"Name":"x"}},{"title":"Dear","Info":{"Id":null,"id2":2,"Name":"x"}}],"codes":[],"rule":null}]
1 293 C 1 2 A [{"did":{"id":"3","num":1},"NId":"a1,b1,c1","Att":null,"isnull":false,"number":"M90","label":[{"title":"Dear","Info":{"Id":null,"id2":2,"Name":"x"}},{"title":"Dear","Info":{"Id":null,"id2":2,"Name":"x"}}],"codes":[],"rule":null}]
我想将datiles列中的每一行转换为行和列,并将它们与原始数据框连接起来,如下面的示例所示:
id Number Type Class Name did NId Att ..... .... label ........
0292 C 1 2 A {"id":"3","num":1} a1,b1,c1 null [{"title":"Dear","Info"{"Id":null,"id2":2,"Name":"x"}},{"title":"Dear","Info":{"Id":null,"id2":2,"Name":"x"}}]
我已经按需要完成了此操作,但我不知道如何将其与原始数据帧连接,因为它们之间没有密钥:
df['datiles']=data['datiles'].apply(json.loads)
df2 = pd.DataFrame([])
for x in df['datiles'].values.tolist():
df2 = df2 .append(pd.DataFrame(x))
display(df2)
如何拆分列并同时联接?
我曾尝试使用json_normalize,但我遇到了这个错误
AttributeError: 'list' object has no attribute 'values'
另外,我也看到过这些帖子,但不起作用,可能是因为列表结构
您可以使用
df
的索引,并将其显式设置为要加入的新数据帧,如下所示:
df['datiles'] = df['datiles'].apply(json.loads).apply(pd.DataFrame)
out = df.drop('datiles', axis=1).join(
pd.concat(df['datiles'].values, keys=df.index).droplevel(1))
解释
第一行执行双重apply
:json.loads
(如您所知)和pd.DataFrame
(您也已了解,但这里我们在apply
而不是循环中执行)
第二行包含df['datiles']
内部的所有DataFrames
,但使用df
本身的索引作为键。结果是一个多索引
,对于给定的键可能有几行(如果原始datiles
JSON字符串是一个包含多个元素的列表)。在任何情况下,我们都会放弃第二级。然后,join
执行其通常的操作(在索引上)
示例
对于SO答案,设置有点冗长(我希望我们有一个展开
或折叠
宏),所以我粘贴了它
关键是,第一个datiles
是一个包含两个元素的JSON列表,只是为了执行上面的逻辑。除此之外,它的内容与OP相同
输出
id Number Type Class Name did NId Att \
0 292 C 1 2 A {'id': '1', 'num': 1} a1,b1,c1 None
0 292 C 1 2 A {'id': '2', 'num': 1} a1,b1,c1 None
1 293 C 1 2 A {'id': '3', 'num': 1} a1,b1,c1 None
isnull number label codes \
0 False M90 [{'title': 'Dear', 'Info': {'Id': None, 'id2':... []
0 False M90 [{'title': 'Dear', 'Info': {'Id': None, 'id2':... []
1 False M90 [{'title': 'Dear', 'Info': {'Id': None, 'id2':... []
rule
0 None
0 None
1 None
第一个数据帧的副本中存在打字错误“Info”{“Id”:null,…
不是一个dict
也不是有效的JSON。那列datiles
真的包含dict
s吗?我怀疑它,在我看来更像是JSON字符串(按排印模式)。它起作用了,谢谢