我有一个按(年,月)分组的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 ”。
我尝试过遍历群组,重置索引并连接帧,但感觉就像我忽略了一些更简单的方法!
谢谢。
答案 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。