如何在Pandas月内第n个工作日分组?

时间:2013-06-06 21:32:25

标签: python pandas

我有一个按(年,月)分组的DataFrame。我想看看每个(年,月)组中第n行的统计数据 - 最好的方法是什么?

所以我的设置是这样的:

import pandas as pd
import numpy as np

index = pd.bdate_range('2012-1-1', periods=250)
data = np.random.rand(250,4)
df = pd.DataFrame(data, index=index, columns=['A', 'B', 'C', 'D'])
group = df.groupby([lambda x: x.year, lambda x: x.month])

所以每个小组都是:

group.get_group((2012,1))

                   A         B         C         D
2012-01-02  0.981690  0.751655  0.040473  0.586829
2012-01-03  0.079392  0.726818  0.568717  0.916406
2012-01-04  0.138018  0.550194  0.321462  0.300273
2012-01-05  0.252901  0.169159  0.941170  0.733971
2012-01-06  0.054530  0.547185  0.751854  0.014632
2012-01-09  0.477299  0.411725  0.867734  0.986216
2012-01-10  0.791581  0.975181  0.453106  0.722259
2012-01-11  0.519475  0.667305  0.521249  0.114595
2012-01-12  0.240605  0.934308  0.957045  0.077284
2012-01-13  0.581049  0.946498  0.961401  0.733273
2012-01-16  0.534614  0.474576  0.580191  0.373324
2012-01-17  0.137119  0.760280  0.985439  0.044371
2012-01-18  0.966209  0.213359  0.333371  0.746351
2012-01-19  0.676534  0.370279  0.710987  0.061505
2012-01-20  0.058050  0.557478  0.116016  0.964448
2012-01-23  0.190743  0.900814  0.064952  0.369975
2012-01-24  0.048135  0.878783  0.970095  0.363559
2012-01-25  0.343305  0.023731  0.514298  0.131724
2012-01-26  0.626055  0.230893  0.557264  0.871486
2012-01-27  0.212099  0.287510  0.260152  0.634898
2012-01-30  0.233956  0.457482  0.516915  0.738543
2012-01-31  0.011327  0.161360  0.804554  0.897392

我想得到所有群体中第i行的平均值(即每个月的第i个工作日的平均值)。因此输出将有~23行(或者一个月内看到的最多工作日数)和“A”到“D”列。

作为第二步,“扁平化”数据的最佳方法是什么,以便输出只是一个由(i,c)索引的系列,其中i为0到22,如上所述,c为'A'到'D ”。

我尝试过遍历群组,重置索引并连接帧,但感觉就像我忽略了一些更简单的方法!

谢谢。

1 个答案:

答案 0 :(得分:0)

您会很高兴发现名为nth的方法。例如,要访问每个月的第9个条目,

In [15]: group.nth(9)
Out[15]: 
                A         B         C         D
2012 1   0.259695  0.670270  0.467452  0.796057
     2   0.744701  0.633857  0.530602  0.978068
     3   0.901194  0.684747  0.091563  0.582004
     4   0.728239  0.421065  0.044452  0.750780
     5   0.792513  0.016461  0.646832  0.858187
     6   0.662756  0.753480  0.030328  0.105000
     7   0.630161  0.473097  0.504618  0.156850
     8   0.143587  0.955368  0.939281  0.632951
     9   0.115629  0.310003  0.170585  0.166392
     10  0.458202  0.293087  0.171136  0.106911
     11  0.098920  0.275812  0.057490  0.683633
     12  0.601598  0.663051  0.094602  0.500480

要解决您的第二个问题 - 生成按日期和列名称编制索引的系列,例如('A', 1) - 请使用df1.unstack().squeeze()。取消堆栈只是按照您想要的方式重塑它,squeeze将结果从单列DataFrame转换为Series。