将具有不同值的 JSON 提取到 Pandas 中重复的 id 列

Jav*_*más 1 python json concat pandas

我有以下数据框:

df = pd.DataFrame({'id':['0001', '0001'],
                   'vat_countries': [{'vat': 21, 'country': 'ES'}, 
                                     {'vat': 23, 'country': 'GR'}]
                   })

id        vat_countries
0001     {'vat': 21, 'country': 'ES'}
0001     {'vat': 23, 'country': 'GR'}
Run Code Online (Sandbox Code Playgroud)

我想得到的是:

id   vat  country
0001  21    'ES'
0001  23    'GR'
Run Code Online (Sandbox Code Playgroud)

阅读其他 SO 问题我得到以下代码:

df = df.drop('vat_countries', 1).assign(**pd.DataFrame(list_df['vat_countries'].values.tolist()))
Run Code Online (Sandbox Code Playgroud)

然而,这给了我:

id   vat  country
    0001  21    'ES'
    0001  21    'ES'
Run Code Online (Sandbox Code Playgroud)

这是错误的。

我已经能够得到我想要使用的结果:

c = pd.concat([pd.DataFrame(df[column].values.tolist()), 
               df.drop(column, 1).reset_index()], 
              axis=1, ignore_index=True)
Run Code Online (Sandbox Code Playgroud)

但这需要手动键入列名。否则,列名是 0, 1, 2, 3 ...

有什么方法可以在保留列名称的同时获得所需的输出?谢谢

编辑:尝试 BEN_YO 解决方案。我有这个 在此处输入图片说明 在代码之后我得到了这个 在此处输入图片说明 一切都被复制了两次

WeN*_*Ben 6

尝试pop修复您的代码

df.join(pd.DataFrame(df.pop('vat_countries').tolist(),index=df.index))
Out[300]: 
     id  vat country
0  0001   21      ES
1  0001   23      GR
Run Code Online (Sandbox Code Playgroud)