我有这种格式的数据框:
value identifier
2007-01-01 0.087085 55
2007-01-01 0.703249 56
2007-02-01 0.967872 55
2007-02-01 0.954142 56
2008-01-01 0.804404 55
2008-01-01 0.475372 56
2008-02-01 0.025823 55
2008-02-01 0.414736 56
我需要按月制作一个箱形图。有两种方法可以实现:首先按索引分组,复制到新数据帧,然后按月进行分组:
by_index = dd.groupby(dd.index).mean()
temp = pd.DataFrame()
temp['value'] =by_index['value']
by_month = temp.groupby(lambda x: x.month)
by_month.boxplot(subplots=False)
或者首先按月分组,直接采用均值和情节:
by_month = dd.groupby(lambda x: x.month)
by_month_avg = by_month.mean()
by_month_avg['value'].plot()
问题在于两种方法之间的平均值不同。什么是正确的方法?这两个结果应该相等吗?
答案 0 :(得分:1)
我认为这种混淆是因为你在这两种情况下使用了不同的语法,并且不太明显的区别是什么。在一种情况下,您正在使用lambda对索引进行操作:
dd.groupby(lambda x: x.month).mean()
或者,您可以这样做(类似于您在其他情况下所做的):
dd.groupby( dd.index.month ).mean()
然后应该清楚为什么以上给出了不同的答案:
dd.groupby( dd.index ).mean()
在一种情况下,结果是按日期计算的,另一种是月份。也许这个打印转储也会有所帮助:
dd.index.date
array([datetime.date(2007, 1, 1), datetime.date(2007, 1, 1),
datetime.date(2007, 2, 1), datetime.date(2007, 2, 1),
datetime.date(2008, 1, 1), datetime.date(2008, 1, 1),
datetime.date(2008, 2, 1), datetime.date(2008, 2, 1)], dtype=object)
dd.index.month
array([1, 1, 2, 2, 1, 1, 2, 2])
我刚刚添加了' date'属性使其打印更干净,但这个想法没有改变。前组有4组,后者有2组。
根据后续问题,我想知道你真正想要的是按月和按年分组吗?
dd.groupby([dd.index.year,dd.index.month]).mean()
value identifier
2007 1 0.395167 55.5
2 0.961007 55.5
2008 1 0.639888 55.5
2 0.220279 55.5