具有重复索引的数据框上的groupby或groupby的平均值

时间:2015-04-17 12:06:26

标签: python pandas

我有这种格式的数据框:

               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()

问题在于两种方法之间的平均值不同。什么是正确的方法?这两个结果应该相等吗?

1 个答案:

答案 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