4

我有一个按(年,月)分组的数据框。我想查看每个(年、月)组中第 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”。

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

谢谢你。

4

1 回答 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

要解决您的第二个问题 - 生成按日期和列名索引的系列('A', 1)- 使用df1.unstack().squeeze(). unstacking 会按照您想要的方式重塑它,squeeze并将结果从单列 DataFrame 转换为 Series。

于 2013-06-06T21:43:49.560 回答