我有以下数据示例:
{"rates":{
"IT":{
"country_name":"Italy",
"standard_rate":20,
"reduced_rates":{
"food":13,
"books":11
}
},
"UK":{
"country_name":"United Kingdom",
"standard_rate":21,
"reduced_rates":{
"food":12,
"books":1
}
}
}}
IT
和UK
是国家/地区代码,可以更改。每次我采样数据时,密钥可能会不同。我没有可以中继的常数键名。
我有以下创建数据框的代码:
df = pd.DataFrame(columns=['code', 'country_name')
for k,item in dic['rates'].items():
df = df.append( {'code': k, 'country_name': item['country_name']} , ignore_index=True)
这给了我
code country_name
0 IT Italy
1 UK United Kingdom
现在,https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.append.html文档报告说这使用效率不高。
文档建议使用:
pd.concat([pd.DataFrame([i], columns=['A']) for i in range(5)], ignore_index=True)
所以我尝试做:
new = pd.concat([pd.DataFrame([item], columns=['code', 'country_name']) for k,item in dic['rates'].items()], ignore_index=True)
但这给出了:
code country_name
0 NaN Italy
1 NaN United Kigdom
我知道发生这种情况是因为样本中没有名为code
的实际键,这只是我为数据框中的列分配的名称,但我不知道如何解决。 / p>
建议?
答案 0 :(得分:1)
使用列表理解
例如:
import pandas as pd
dic = {"rates":{
"IT":{
"country_name":"Italy",
"standard_rate":20,
"reduced_rates":{
"food":13,
"books":11
}
},
"UK":{
"country_name":"United Kingdom",
"standard_rate":21,
"reduced_rates":{
"food":12,
"books":1
}
}
}}
df = pd.DataFrame([{'code': k, 'country_name': v["country_name"]} for k,v in dic["rates"].items()])
print(df)
输出:
code country_name
0 IT Italy
1 UK United Kingdom
答案 1 :(得分:1)
使用内置的熊猫功能,您似乎可以轻松实现所需的结果。
df = pd.DataFrame.from_dict(dic["rates"])
这给出了您要查找的内容的转置版本。这可以通过以下方法解决:
df = df.T
这将产生正确的表格,但以国家/地区代码为索引。
df = df.reset_index()
df = df.rename(index=str, columns={"index": "country_code"})
它也包括字典中您可能想要或不想要的其他数据。您可以使用放置功能,也可以更简单:
df = df[["country_code", "country_name"]]
请记住,至少上面的前3个可以压缩为一行代码。
我认为利用实际的熊猫功能更为有效,并且可能比遍历字典项更可取。我建议在较大的数据集上进行测试,以查看不同方法的缩放比例,因为一般而言,大熊猫的开销会使它在较小的数据集上表现较差,但缩放效果很好。