将字典嵌套元素提取到Pandas数据框架中



我有一个字典列表l1,看起来像这样:

[{'A1': 'string',
'B1': {'ba': 'string',
'bb': 'string',
'bc': 'string',
'bd': 'string',
'be': 'string'},
'C1': {'ca': 'string',
'cb': [[[123,123],[123,123]]]},
'D1': 'string'},
...]

某些字典(l1元素)可能缺少一些键,例如,l1的第二个列表元素可能没有'bc': " string'键/值对。

我需要提取以下顶部和嵌套键/值元素到数据框架中,它看起来像这样:

bc      bd      cb                        D1
string  string  [[[123,123],[123,123]]]   string
N/A     string  [[[123,123],[123,123]]]   string
...
string  N/A     [[[123,123],[123,123]]]   string
我的代码如下:
temp_df = pd.DataFrame(columns = ['bc','bd','cb','D1']
for i in l1:
temp_df = temp_df.append({'bc': i.get(['B1']['bc'],'N/A'),
'bd': i.get(['B1']['bd'],'N/A'),
'cb': i.get(['C1']['cb'],'N/A'),
'D1': i.get(['D1'],'N/A')}, 
ignore_index=True)

我得到的错误如下:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-113-543c6addad42> in <module>
1 for i in l1:
----> 2     temp_df = temp_df.append({'bc': i.get(['B1']['bc'],'N/A'),
3                                 'bd': i.get(['B1']['bd'],'N/A'),
4                                 'C1': i.get(['C1']['cb'],'N/A'),
5                                 'D1': i.get(['D1'],'N/A')}, 
TypeError: list indices must be integers or slices, not str

我做错了什么?

代替i.get(['B1']['bc'],'N/A'),这是无效的python语法,使用i.get('B1', {}).get('bc', 'N/A')来获得嵌套键。也不要动态地追加到pandas数据框,它很慢。先添加到列表,然后将列表转换为数据框架。

lst = []
for i in l1:
lst.append({
'bc': i.get('B1', {}).get('bc', 'N/A'),
'bd': i.get('B1', {}).get('bd', 'N/A'),
'cb': i.get('C1', {}).get('cb', 'N/A'),
'D1': i.get('D1', 'N/A')
})
pd.DataFrame(lst)
bc      bd                          cb      D1
0  string  string  [[[123, 123], [123, 123]]]  string

您可以参考@Psidom的错误答案,但是,为了实现您想要做的事情,您可以选择使用json_normalize

pd.json_normalize(l1).rename(columns={
'B1.bc': 'bc',
'B1.bd': 'bd',
'C1.cb': 'cb'
}).fillna('N/A')[['bc', 'bd', 'cb', 'D1']]

相关内容

  • 没有找到相关文章

最新更新