如何从字符串正确分配值到数据框?

时间:2019-01-22 12:50:23

标签: python pandas

我有以下数据示例:

{"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
     }
  }  
}}

ITUK是国家/地区代码,可以更改。每次我采样数据时,密钥可能会不同。我没有可以中继的常数键名。

我有以下创建数据框的代码:

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>

建议?

2 个答案:

答案 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个可以压缩为一行代码。

我认为利用实际的熊猫功能更为有效,并且可能比遍历字典项更可取。我建议在较大的数据集上进行测试,以查看不同方法的缩放比例,因为一般而言,大熊猫的开销会使它在较小的数据集上表现较差,但缩放效果很好。