python - 字典列表到数据框列中
问题描述
我在 a 中有一个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
并将其明确设置为您的新DataFrame
加入,如下所示:
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))
解释
- 第一行做了一个 double
apply
:json.loads
(正如你所想的那样) 和pd.DataFrame
(你也已经想出来了,但在这里我们用一个apply
而不是循环来做)。 - 第二行连接所有
DataFrames
内部df['datiles']
的,但使用df
自身的索引作为键。结果是 aMultiIndex
,给定键可能有几行(如果原始datiles
JSON 字符串是超过 1 个元素的列表)。无论如何,我们放弃了第二个级别。然后join
做它通常的事情(在索引上)。
例子
对于 SO 答案,设置有点冗长(我希望我们有一个expand
orfold
宏),所以我将它粘贴到pastebin中。
重点是,第一个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
推荐阅读
- python - 如何在 .wav 文件的末尾添加几秒钟的静音?
- firebase - 如何在 Flutter 中使用带有路由的 firebase 初始化
- python - Ptyhon:如何计算避免零的数组列表的平均值和百分位数
- javascript - 在 React 中设置状态
- javascript - Stripe Portal Stripe 安全问题
- nginx - 将 nginx rtmp 片段发送到 WebRTC
- python-3.x - 如何在python中找到带有select_one的链接
- php - 通过 RSS 中的标签 ID 获取 WordPress 帖子
- ruby - 如何使用“--auto-open-devtools-for-tabs”在 selenium webdriver 中从元素选项卡切换到网络选项卡?
- java - 使用 Weka 创建决策树