1

質問

階層インデックス行に対して数値演算を実行する効率的な方法は何ですか?

問題

1 GB を超える大きなデータフレームがあり、年ごとにインデックスが作成され、次に国コードによってインデックスが作成されます。小さなサブセットを以下に示します。各国には、年に複数回の観測があります。1 年間の各国の観測値の平均を取り、全体の平均を返したいと思います。望ましい最終結果は、年ごとに索引付けされ、次に各国の年間平均によって索引付けされたデータフレームになります。

概念的には、次のようなことをしたいと思います。

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

私が試したこと

パンダのマルチインデックスの利点?

pandas.multiindex のレベルに条件を適用するには?

データフレームのサイズが大きいため、ループを避け、上記の 2 つの質問に対する解決策のようにデータフレームを複数回コピーすることを検討しています。

効率的なソリューションに関するアイデアはありますか? ご覧いただきありがとうございます。

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

年と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
于 2013-07-11T16:47:39.563 に答える