对分层索引行执行数值运算的有效方法是什么?
我有一个超过1GB的大型数据框,按年份编制索引,然后按国家/地区代码编制索引。下面显示了一个小子集。每个国家/地区每年都有多次观察。我想记录每个国家一年的观察结果的平均值并返回总体平均值。期望的最终结果将是按年度索引的数据框,然后是每个国家的年平均值。
从概念上讲,我想做类似的事情:
df.ix[:,['x3yv_E', 'x3yv_D', 'x1yv_E', 'x1yv_D']].groupby(df.year).groupby(level=1).apply(lambda x: np.mean(x))
继承数据集:
x3yv_E x3yv_D x1yv_E x1yv_D
year
2003 12 0.000000 0.000000 0.000000 0.000000
34 0.009953 0.001400 0.007823 0.000950
12 0.010210 0.001136 0.008333 0.000722
34 0.011143 0.006319 0.007520 0.006732
72 0.018791 0.016717 0.018808 0.015206
2004 0 0.009115 0.000000 0.010243 0.000000
38 0.009059 0.000932 0.010042 0.000573
53 0.009618 0.001152 0.010724 0.000729
70 0.000000 0.000000 0.000000 0.000000
70 0.020655 0.018411 0.012965 0.011640
Benefits of panda's multiindex?
How to apply condition on level of pandas.multiindex?
由于数据帧的大小,我希望避免循环并多次复制数据帧,就像上面两个问题的解决方案一样。
关于有效解决方案的任何想法?谢谢你看看!
答案 0 :(得分:1)
创建数据
In [12]: df = DataFrame(randn(10,4),columns=list('ABCD'))
In [13]: df['year'] = 2003
In [14]: df['id'] = [12,34,12,34,72,0,38,53,70,70]
In [16]: df.loc[:5,'year'] = 2004
In [17]: df
Out[17]:
A B C D year id
0 -1.917262 0.228599 -0.463695 0.776567 2004 12
1 2.064658 -0.716104 -1.399685 0.402077 2004 34
2 -1.282627 0.338368 0.757658 -0.114086 2004 12
3 1.190319 -1.592282 0.942431 -0.778128 2004 34
4 1.928094 0.532387 -0.352155 -0.039304 2004 72
5 0.535093 -1.655569 -0.309651 0.438992 2004 0
6 0.332428 -0.427696 -1.324072 2.158907 2003 38
7 -1.343306 -0.288373 0.544344 -1.361189 2003 53
8 0.959273 -0.420134 0.691108 -0.469833 2003 70
9 0.692352 0.101226 -0.161140 -0.100968 2003 70
Groupby year和id,然后是
In [21]: df.groupby(['year','id']).mean()
Out[21]:
A B C D
year id
2003 38 0.332428 -0.427696 -1.324072 2.158907
53 -1.343306 -0.288373 0.544344 -1.361189
70 0.825812 -0.159454 0.264984 -0.285401
2004 0 0.535093 -1.655569 -0.309651 0.438992
12 -1.599944 0.283483 0.146981 0.331241
34 1.627488 -1.154193 -0.228627 -0.188025
72 1.928094 0.532387 -0.352155 -0.039304
按年份表示
In [24]: df.groupby(['year']).mean()
Out[24]:
A B C D id
year
2003 0.160187 -0.258744 -0.062440 0.056729 57.750000
2004 0.419713 -0.477434 -0.137516 0.114353 27.333333
按id
In [25]: df.groupby(['id']).mean()
Out[25]:
A B C D year
id
0 0.535093 -1.655569 -0.309651 0.438992 2004
12 -1.599944 0.283483 0.146981 0.331241 2004
34 1.627488 -1.154193 -0.228627 -0.188025 2004
38 0.332428 -0.427696 -1.324072 2.158907 2003
53 -1.343306 -0.288373 0.544344 -1.361189 2003
70 0.825812 -0.159454 0.264984 -0.285401 2003
72 1.928094 0.532387 -0.352155 -0.039304 2004