python - 从列中的dict中提取值作为列值,存在NA
问题描述
我目前正在尝试从出现在一系列列中的几个 dicts 中提取值,有两个问题:
由于有 4 列有问题,因此它们是通过以下代码行从先前的 dict-in-column 值中解压缩的:
df = pd.concat([df.drop(['ids'], axis = 1), df['ids'].apply(pd.Series)], axis = 1)
这个字典是在以下形式的列中解压缩一个字典:
d = {'a': {'id': 12}, 'b': {'id': 13}, 'c': {'id': 14}, 'd': {'id': 15}}
dictd
的长度在 0-4 之间。
在解压数据框之前,我解压的列如下所示:
ids
406 {'a': {'id': '12'}}
408 None
409 {'a': {'id': '21'}, 'b': {'id': '23'}}
417 {'a': {'id': '53'}, 'b': {'id': '98'}, 'c': {'id': '45'}}
419 None
解压后它现在有形式
a b c
408 None {'id': '12'} None
409 {'id': '32'} {'id': '45'} {'id': '36'}
417 {'id': '09'} {'id': '31'} None
虽然这最初解决了我的第一个问题,但我现在正试图将值从包含字典的列中提取出来,对此我有点不知所措。
我尝试过的潜在解决方案只是为每一列(a、b、c)运行上面的代码段,但这既丑陋又低效。至多我知道,pd.json_normalize
当我第一次启动我的程序时,一个简单的修复方法是对初始数据帧进行修复,但是对于似乎可以轻松解决的问题,这将需要进行重大修复和重构。作为参考,理想的输出是这样的:
a b c
408 None 12 None
409 32 45 36
417 09 31 None
整个数据框有几十万行,有 20 列在不断变化。
解决方案
一种选择是为apply
每一列添加一个客户函数
def my_func(val):
if isinstance(val,dict):
return val['id']
else:
return val
for col in df.columns:
df[col]=df[col].apply(my_func)
a b c
0 None 12 None
1 32 45 36
2 09 31 None
推荐阅读
- vb.net - Crystal Report vb.net使用没有关系表的子报表
- java - DateTime 格式以具有尾随零并捕捉到毫、微或纳米格式
- julia - 如何使用 Gadfly 与 Julia 划线(设施位置问题)?
- php - Cakephp,文件不是数据库
- php - 使用 php 和单选按钮更新数据
- android - 在使用 OkHttp3 的查询参数之前强制使用斜杠
- swift - 从滚动视图中获取索引
- excel - 除非先执行 debug.print,否则不会设置变量
- react-native - 重新加载时反应本机加载旧版本
- ios - IOS 版 Google Cardboard VR 应用出现黑屏