所以我有两个字典列表...
目标是得到一个最终数据集,其外观如下:
由于我的数据集涉及特定年份所有12个月的大量学生,因此我使用Pandas进行数据整理。具体步骤如下:
首先,使用“name”关键字将两个列表合并成一个数据框。
然后创建一个字典作为趋势列。
并且,使用选定列的
很明显,最终的数据集并不是我想要的。我得到的不是包含两个月份的2个字典,而是4个分别包含所有月份的字典。我该怎么解决?我更希望在Pandas内部解决这个问题,而不是再次将最终输出减少到所需状态。
list_yearly = [
{'name':'john',
'total_year': 107
},
{'name':'cathy',
'total_year':124
},
]
list_monthly = [
{'name':'john',
'month':'Jan',
'total_month': 34
},
{'name':'cathy',
'month':'Jan',
'total_month':78
},
{'name':'john',
'month':'Feb',
'total_month': 73
},
{'name':'cathy',
'month':'Feb',
'total_month':46
},
]
目标是得到一个最终数据集,其外观如下:
{'name':'john',
'total_year': 107,
'trend':[{'month':'Jan', 'total_month': 34},{'month':'Feb', 'total_month': 73}]
},
{'name':'cathy',
'total_year':124,
'trend':[{'month':'Jan', 'total_month': 78},{'month':'Feb', 'total_month': 46}]
},
由于我的数据集涉及特定年份所有12个月的大量学生,因此我使用Pandas进行数据整理。具体步骤如下:
首先,使用“name”关键字将两个列表合并成一个数据框。
In [5]: df = pd.DataFrame(list_yearly).merge(pd.DataFrame(list_monthly))
In [6]: df
Out[6]:
name total_year month total_month
0 john 107 Jan 34
1 john 107 Feb 73
2 cathy 124 Jan 78
3 cathy 124 Feb 46
然后创建一个字典作为趋势列。
ln [7]: df['trend'] = df.apply(lambda x: [x[['month', 'total_month']].to_dict()], axis=1)
In [8]: df
Out[8]:
name total_year month total_month \
0 john 107 Jan 34
1 john 107 Feb 73
2 cathy 124 Jan 78
3 cathy 124 Feb 46
trend
0 [{u'total_month': 34, u'month': u'Jan'}]
1 [{u'total_month': 73, u'month': u'Feb'}]
2 [{u'total_month': 78, u'month': u'Jan'}]
3 [{u'total_month': 46, u'month': u'Feb'}]
并且,使用选定列的
to_dict(orient='records')
方法将其转换回字典列表:In [9]: df[['name', 'total_year', 'trend']].to_dict(orient='records')
Out[9]:
[{'name': 'john',
'total_year': 107,
'trend': [{'month': 'Jan', 'total_month': 34}]},
{'name': 'john',
'total_year': 107,
'trend': [{'month': 'Feb', 'total_month': 73}]},
{'name': 'cathy',
'total_year': 124,
'trend': [{'month': 'Jan', 'total_month': 78}]},
{'name': 'cathy',
'total_year': 124,
'trend': [{'month': 'Feb', 'total_month': 46}]}]
很明显,最终的数据集并不是我想要的。我得到的不是包含两个月份的2个字典,而是4个分别包含所有月份的字典。我该怎么解决?我更希望在Pandas内部解决这个问题,而不是再次将最终输出减少到所需状态。