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

Extract JSON with different values to repeated id column in 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'}

我想得到的是:

id   vat  country
0001  21    'ES'
0001  23    'GR'

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

df = df.drop('vat_countries', 1).assign(**pd.DataFrame(list_df['vat_countries'].values.tolist()))

但是,这给了我:

id   vat  country
    0001  21    'ES'
    0001  21    'ES'

这是错误的。

我已经能够使用以下方法获得我想要的结果:

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

但这需要手动输入列名。否则,列名称为 0、1、2、3...

有什么方法可以在保留列名的同时得到我想要的输出吗? 谢谢

编辑:尝试 BEN_YO 解决方案。我有这个 在代码之后我得到了这个 一切都被复制了两次

我会在具有 dicts 和 join 结果的列上应用 pd.Series,即:

import pandas as pd
df = pd.DataFrame({'id':['0001', '0001'], 'vat_countries': [{'vat': 21, 'country': 'ES'}, {'vat': 23, 'country': 'GR'}]})
final_df = df.join(df.vat_countries.apply(pd.Series))
print(final_df)

输出:

     id                 vat_countries  vat country
0  0001  {'vat': 21, 'country': 'ES'}   21      ES
1  0001  {'vat': 23, 'country': 'GR'}   23      GR

如您所见,剩下 vat_countires,如果您想丢弃它,您可以简单地 drop 它。

尝试 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

您可以使用 string methods 访问各个值:

df["vat"] = df.vat_countries.str["vat"]
df["country"] = df.vat_countries.str["country"]
df      

    id         vat_countries               vat  country
0   0001    {'vat': 21, 'country': 'ES'}    21  ES
1   0001    {'vat': 23, 'country': 'GR'}    23  GR