用Pandas数据框中的行填充嵌套字典

时间:2019-07-31 19:31:08

标签: pandas loops dataframe dictionary indexing

我试图通过迭代嵌套的字典并用Pandas数据框中一行的条目填充每个子词典的值,来用Python中的Pandas数据框中的条目填充词典。

尽管数据字典中的子字典与行中的子字典一样多,但是所有字典都填充有数据帧最后一行中的数据,而不是每个字典都使用每一行。

这是玩具可复制的示例。

var data = JsonConvert.DeserializeObject<dynamic>(rawJson);
var rawForecasts = data.metcheckData.forecastLocation.forecast;

我该如何修改我的代码,以使每个词典填充与数据框不同的行?

2 个答案:

答案 0 :(得分:3)

我没有遍历您的代码来查找错误,因为解决方案是使用方法to_dict的单一代码。

这里是样本数据的最小工作示例。

import pandas as pd

# initialize an empty df
data = pd.DataFrame()

# populate data frame with entries
data['name'] = ['Joe Smith', 'Mary James', 'Charles Williams']
data['school'] =  ["Jollywood Secondary", "Northgate Sixth From", "Brompton High"]
data['subjects'] = [['Maths', 'Art', 'Biology'], ['English', 'French', 'History'], ['Chemistry', 'Biology', 'English']]

# redefine index to match your keys
data.index = ['cand{}'.format(i) for i in range(1,len(data)+1)]

# convert to dict
data_dict = data.to_dict(orient='index')

print(data_dict)

这看起来像这样

{'cand1': {
     'name': 'Joe Smith', 
     'school': 'Jollywood Secondary', 
     'subjects': ['Maths', 'Art', 'Biology']},
 'cand2': {
     'name': 'Mary James', 
     'school': 'Northgate Sixth From', 
     'subjects': ['English', 'French', 'History']},
 'cand3': {
     'name': 'Charles Williams', 
     'school': 'Brompton High', 
     'subjects': ['Chemistry', 'Biology', 'English']}}

答案 1 :(得分:1)

请考虑避免构建字典的回旋处,因为Pandas维护各种方法来渲染嵌套结构,例如to_dictto_json。具体来说,考虑添加新列 cand 并将其设置为to_dict输出的索引:

data['cand'] = 'cand' + pd.Series((data.index.astype('int') + 1).astype('str'))

mydict = data.set_index('cand').to_dict(orient='index')

print(mydict)

{'cand1': {'name': 'Joe Smith', 'school': 'Jollywood Secondary', 
           'subjects': ['Maths', 'Art', 'Biology']}, 
 'cand2': {'name': 'Mary James', 'school': 'Northgate Sixth From', 
           'subjects': ['English', 'French', 'History']}, 
 'cand3': {'name': 'Charles Williams', 'school': 'Brompton High', 
           'subjects': ['Chemistry', 'Biology', 'English']}}