1

问题

对分层索引行执行数值运算的有效方法是什么?

问题

我有一个超过 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

我试过的

panda的多索引的好处?

如何在 pandas.multiindex 级别应用条件?

由于数据框的大小很大,我希望避免循环并多次复制数据框,就像上述两个问题的解决方案所建议的那样。

关于有效解决方案的任何想法?谢谢参观!

4

1 回答 1

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

按编号

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
于 2013-07-11T16:47:39.563 回答