python - 带有空列表的嵌套字典到 Pandas 数据框列
问题描述
我有一些来自 API 的数据,我正在尝试将其转换为 Pandas 数据框。我正在努力从嵌套字典中的列表中提取“station_xyz__cr”ID号(其中列表可以为空,如中间数据集中)。
output = {'data': [{'abc_serial_number__c': 'ABC2020-07571',
'id': 'V48000000000F79',
'modified_date__v': '2020-06-15T05:13:14.000Z',
'name__v': 'VVV-001039',
'station_xyz__cr': {'data': [{'id': 'V5J000000000B86'}],
'responseDetails': {'limit': 250,
'offset': 0,
'size': 1,
'total': 1}}},
{'abc_serial_number__c': 'ABC2020-09952',
'id': 'V48000000001B94',
'modified_date__v': '2020-06-24T11:30:40.000Z',
'name__v': 'VVV-004040',
'station_xyz__cr': {'data': [],
'responseDetails': {'limit': 250,
'offset': 0,
'size': 1,
'total': 1}}},
{'abc_serial_number__c': 'ABC2020-09196',
'id': 'V48000000001B95',
'modified_date__v': '2020-06-23T09:38:18.000Z',
'name__v': 'VVV-004041',
'station_xyz__cr': {'data': [{'id': 'V5J000000000Z10'}],
'responseDetails': {'limit': 250,
'offset': 0,
'size': 1,
'total': 1}}}],
'responseDetails': {'limit': 1000, 'offset': 0, 'size': 3, 'total': 3},
'responseStatus': 'SUCCESS'}
我正在尝试将嵌套的 id 数据放入数据框中的列中,如下所示:
station_xyz__cr.data.id
0 V5J000000000B86
1 None
2 V5J000000000Z10
我尝试使用 json_normalize 转换为数据框(删除我不需要的列):
df = pd.json_normalize(output['data'])
df = df.loc[:, ~df.columns.str.startswith('station_xyz__cr.responseDetails')]
print(df)
abc_serial_number__c id modified_date__v name__v \
0 ABC2020-07571 V48000000000F79 2020-06-15T05:13:14.000Z VVV-001039
1 ABC2020-09952 V48000000001B94 2020-06-24T11:30:40.000Z VVV-004040
2 ABC2020-09196 V48000000001B95 2020-06-23T09:38:18.000Z VVV-004041
station_xyz__cr.data
0 [{'id': 'V5J000000000B86'}]
1 []
2 [{'id': 'V5J000000000Z10'}]
但我正在努力将字典的“station_xyz__cr.data”列表转换为简单的 id 数据框:
df2 = pd.DataFrame(df['station_xyz__cr.data'].tolist(), index= df.index)
df2 = df2.rename(columns = {0:'station_xyz__cr.data'})
df2
station_xyz__cr.data
0 {'id': 'V5J000000000B86'}
1 None
2 {'id': 'V5J000000000Z10'}
当我尝试进一步提取时,“无”给我带来了问题。我尝试替换 None - 但我只能用 0 替换:
df.fillna(0, inplace=True)
解决方案
获取 None 值的行索引。使用行索引作为掩码,将行、列组合设置为与数据流下一阶段的其余列值一致的默认值。
isna_idx = pd.isnull(df2['station_xyz__cr.data'])
df2.loc[isna_idx, ['station_xyz__cr.data']] = {'id': '...'}
推荐阅读
- r - 为什么 geom_rect() 与 facet_wrap() 一起使用时会添加许多多层?
- java - 在反序列化期间将 POJO 映射到具有不可变列表的案例类
- sql - 如何在 BigQuery 标准 SQL 中取消嵌套多个数组
- python - 我如何匹配遵循少数特定规则的字符串,例如使用 spacy 匹配器的某些特定字符串之后
- c# - 为什么我在 DataTemplate 中找不到元素?
- objective-c - 无法使用带有某些链接的 NSURLSession 下载图像
- shell - 递归查找文件大小大于 1 GB 的目录中的文件
- azure - consumer.azure.com 的 v3 API 大部分时间都无法返回 offerId
- navigationbar - SwiftUI navigationBarTitle - displayMode: .inline - 崩溃
- excel - 使用 Powershell 从 Excel 工作表中获取复选框?