如何在 Pandas 中按照每月的第 n 个工作日进行分组?

4

我有一个按(年份,月份)分组的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

你会很高兴发现这个叫做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

解决你的第二个问题——生成一个以日期和列名为索引的Series,例如('A', 1)——使用df1.unstack().squeeze()。unstack操作可以将数据重塑成你想要的形式,而squeeze则将结果从单列DataFrame转换为Series。

太棒了,谢谢!尽管Pandas有很多文档,但仍然很难找到满足特定需求的函数,这真是令人惊讶。例如,我仍然无法找到关于nth函数的任何信息。我还有一些关于索引的问题,但会单独提出。 - capitalistcuttle
我在这本书中发现了这个。但你的观点绝对正确:文档应该宣传这个功能。有趣的是,这个问题已经是“pandas groupby nth”的第二个谷歌搜索结果了。 - Dan Allan
我对这个函数有一个问题...假设只有5行具有四月份的索引,那么月份索引4的结果行会全部是NaN还是只会获取第5行? - Ryan Saxe
第五行,如果我理解正确的话。 grouped.get_group(...) 适用于获取具有特定索引的行,而不是第n个索引。 - Dan Allan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接