首页 > 解决方案 > 带有空列表的嵌套字典到 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)

标签: pythonpython-3.xpandasdataframe

解决方案


获取 None 值的行索引。使用行索引作为掩码,将行、列组合设置为与数据流下一阶段的其余列值一致的默认值。

isna_idx = pd.isnull(df2['station_xyz__cr.data'])
df2.loc[isna_idx, ['station_xyz__cr.data']] = {'id': '...'}

推荐阅读