2017-07-31 10 views
1

上の部分スライスを使用して、設定値Iは、次の空のデータフレーム生成コードのこのビット、持っている:私はするつもり何パンダ - マルチインデックス

>>> first = ['foo', 'bar'] 
>>> second = ['baz', 'can'] 
>>> third = ['ok', 'ko'] 
>>> colours = ['blue', 'yellow', 'green'] 

>>> idx = pd.IndexSlice 
>>> ix = pd.MultiIndex.from_arrays(np.array([i for i in itertools.product(first, second, third)]).transpose().tolist(), 
            names=('first', 'second', 'third')) 
>>> df1 = pd.DataFrame(index=ix, columns=colours).sort_index() 
>>> print(df1) 

        blue yellow green 
first second third     
bar baz ko  NaN NaN NaN 
      ok  NaN NaN NaN 
     can ko  NaN NaN NaN 
      ok  NaN NaN NaN 
foo baz ko  NaN NaN NaN 
      ok  NaN NaN NaN 
     can ko  NaN NaN NaN 
      ok  NaN NaN NaN 

は、別のデータフレームからこのマルチインデックスベースの空のデータフレームを移入されましたそれは、(明確にするため切り捨て列)与えられ、これは次のように、列ベースです:

idx = pd.IndexSlice 
for s in second: 
    for t in third: 
     for c in colours: 
      column_name = '{s}_{t}_{c}'.format(s=s, c=c, t=t) 
      values = df2[column_name] 
      df1.loc[idx[:, s, t], c] = values 

 baz_ok_blue baz_ko_blue can_ok_blue can_ko_blue baz_ok_yellow 
foo -1.385111 -1.014812 -1.419643  1.540341  0.663933 
bar  0.445372 -0.226087  0.450982 -1.114169  0.896522 

は、これまでのところ私はこの方法をしようとしてきました

各繰り返しで、valuesシリーズは正しく決定されますが、Pandasはvaluesのインデックスとdf1のマルチインデックスの第1レベルとが一致しません。結果として、すべてのdf1値はNaNのままです。これは、PandasがMultiIndexを1つのインデックスと照合しようとしているためです。これの方法はありますか?

基本的には、より高いレベルのパースペクティブを得るために、df2(文字列ベース)をdf1(MultiIndexベース)の形式に再配置しようとしています。

答えて

2

その後、stackと最後reindexによって再形成、str.splitによる最初のMultiIndex作成することができます。

df.columns = df.columns.str.split('_', expand=True) 
print (df) 
      baz     can     baz 
      ok  ko  ok  ko  ok 
     blue  blue  blue  blue yellow 
foo -1.385111 -1.014812 -1.419643 1.540341 0.663933 
bar 0.445372 -0.226087 0.450982 -1.114169 0.896522 

df = df.stack([0,1]).reindex(index=df1.index, columns=df1.columns) 
print (df) 
         blue yellow green 
first second third       
bar baz ko -0.226087  NaN NaN 
      ok  0.445372 0.896522 NaN 
     can ko -1.114169  NaN NaN 
      ok  0.450982  NaN NaN 
foo baz ko -1.014812  NaN NaN 
      ok -1.385111 0.663933 NaN 
     can ko  1.540341  NaN NaN 
      ok -1.419643  NaN NaN 
+0

おかげで、華麗な。しかし、いくつかの値は最後の段階で失われているようです(積み重ねてもまだそこに残っていますが、再インデックス後に消えてしまいます - ほとんどがNaNです) – Jivan

+0

シミュレーションが可能ですか? – jezrael

+0

実際には、 'second'と' colour'の列が同じラベルを持つことが原因で発生する可能性があります。 – Jivan

関連する問題