34

2つのデータフレームがあります。df1はマルチインデックスです:

                value
first second    
a     x         0.471780
      y         0.774908
      z         0.563634
b     x         -0.353756
      y         0.368062
      z         -1.721840

およびdf2:

      value
first   
a     10
b     20

2つのデータフレームを1つのマルチインデックス(この場合は「最初の」インデックス)のみとマージするにはどうすればよいですか?必要な出力は次のとおりです。

                value1      value2
first second    
a     x         0.471780    10
      y         0.774908    10
      z         0.563634    10
b     x         -0.353756   20
      y         0.368062    20
      z         -1.721840   20
4

3 に答える 3

20

あなたが使用することができますget_level_values

firsts = df1.index.get_level_values('first')
df1['value2'] = df2.loc[firsts].values

注:あなたはほとんどここでやっていjoinます(df1がMultiIndexであることを除いて)...したがって、これを説明するためのより良い方法があるかもしれません...

例(あなたが持っているものと同様):

df1 = pd.DataFrame([['a', 'x', 0.123], ['a','x', 0.234],
                    ['a', 'y', 0.451], ['b', 'x', 0.453]],
                   columns=['first', 'second', 'value1']
                   ).set_index(['first', 'second'])
df2 = pd.DataFrame([['a', 10],['b', 20]],
                   columns=['first', 'value']).set_index(['first'])

firsts = df1.index.get_level_values('first')
df1['value2'] = df2.loc[firsts].values

In [5]: df1
Out[5]: 
              value1  value2
first second                
a     x        0.123      10
      x        0.234      10
      y        0.451      10
b     x        0.453      20
于 2013-01-04T00:10:22.773 に答える
12

ドキュメントによると、 pandas 0.14以降、単一インデックスとマルチインデックスのデータフレームを単純に結合できます。共通のインデックス名と一致します。how引数はとで期待どおりに機能しますが、興味深いことに、'inner''outer'では逆になっているようです'left''right'これはバグである可能性がありますか?)。

df1 = pd.DataFrame([['a', 'x', 0.471780], ['a','y', 0.774908], ['a', 'z', 0.563634],
                    ['b', 'x', -0.353756], ['b', 'y', 0.368062], ['b', 'z', -1.721840],
                    ['c', 'x', 1], ['c', 'y', 2], ['c', 'z', 3],
                   ],
                   columns=['first', 'second', 'value1']
                   ).set_index(['first', 'second'])
df2 = pd.DataFrame([['a', 10], ['b', 20]],
                   columns=['first', 'value2']).set_index(['first'])

print(df1.join(df2, how='inner'))
                value1  value2
first second                  
a     x       0.471780      10
      y       0.774908      10
      z       0.563634      10
b     x      -0.353756      20
      y       0.368062      20
      z      -1.721840      20
于 2015-08-03T17:34:14.320 に答える
3

構文は.ixインデックスの再作成への強力なショートカットですが、この場合、実際には行と列のインデックスの再作成を組み合わせて行っていないため、インデックスの再作成を使用するだけで、これをもう少しエレガントに行うことができます。

ヘイデンからの準備:

df1 = pd.DataFrame([['a', 'x', 0.123], ['a','x', 0.234],
                    ['a', 'y', 0.451], ['b', 'x', 0.453]],
                   columns=['first', 'second', 'value1']
                   ).set_index(['first', 'second'])
df2 = pd.DataFrame([['a', 10],['b', 20]],
                   columns=['first', 'value']).set_index(['first'])

次に、これはiPythonでは次のようになります。

In [4]: df1
Out[4]: 
              value1
first second        
a     x        0.123
      x        0.234
      y        0.451
b     x        0.453

In [5]: df2
Out[5]: 
       value
first       
a         10
b         20

In [7]: df2.reindex(df1.index, level=0)
Out[7]: 
              value
first second       
a     x          10
      x          10
      y          10
b     x          20

In [8]: df1['value2'] = df2.reindex(df1.index, level=0)

In [9]: df1
Out[9]: 
              value1  value2
first second                
a     x        0.123      10
      x        0.234      10
      y        0.451      10
b     x        0.453      20

reindexメソッドで使用する必要のあるレベルのメモテクニック:より大きなインデックスですでにカバーしているレベルを示します。したがって、この場合、df2はすでにdf1.indexでカバーされているレベル0を持っていました。

于 2013-01-08T04:17:51.167 に答える