将具有不同值的 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 解决方案。我有这个
在代码之后我得到了这个
一切都被复制了两次
我会在具有 dict
s 和 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
我有以下数据框:
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 解决方案。我有这个
我会在具有 dict
s 和 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