2017-03-01 4 views
1

複数のインデックスを持つロングフォーマットdfをワイドフォーマットdfにキャストしようとしています。 df_in.pivot()が失敗し、なぜかpd.pivot_tableが結果を奇妙な階層インデックスで返すので、キャストしようとしている列にアクセスできないのですか?複数のインデックスを持つパンダdf.pivot()とpd.pivot_table()

# input table 
df_in = pd.DataFrame({'idx1':range(2)*4, 'idx2':['a']*4+['b']*4, 'field': ['f1']*2+['f2']*2+['f1']*2+['f2']*2, 'value': np.array(range(2)*4)*2+1}) 
''' 
    field idx1 idx2 value 
0 f1  0 a  1 
1 f1  1 a  3 
2 f2  0 a  1 
3 f2  1 a  3 
4 f1  0 b  1 
5 f1  1 b  3 
6 f2  0 b  1 
7 f2  1 b  3 
''' 

# want something like this 
pd.DataFrame({'idx1':range(2)*2, 'idx2': ['a']*2+['b']*2, 'a':[1,3]*2, 'b':[1,3]*2}) 
''' 
    a b idx1 idx2 
0 1 1  0 a 
1 3 3  1 a 
2 1 1  0 b 
3 3 3  1 b 
''' 

#doesn't work => ValueError: all arrays must be same length 
df_in.pivot(index=['idx1','idx2'], columns =['field']) 

#doesn't work => weird hierarchical index 
pd.pivot_table(df_in, index=['idx1','idx2'], columns =['field']) 

''' 
      value 
field  f1 f2 
idx1 idx2   
0 a  1 1 
    b  1 1 
1 a  3 3 
    b  3 3 
''' 
# doesn't work => KeyError: 'f1' 
pd.pivot_table(df_in, index=['idx1','idx2'], columns =['field'])['f1'] 

# doesn't work => KeyError: 'f1' 
pd.pivot_table(df_in, index=['idx1','idx2'], columns =['field']).reset_index()['f1'] 

答えて

1

明示的にリストの代わりに文字列として値列を指定して、マルチレベルの列を回避するためには十分であろう:

df_in.pivot_table(values='value', index=['idx1', 'idx2'], columns='field').reset_index() 

#field idx1 idx2 f1 f2 
#0  0  a 1 1 
#1  0  b 1 1 
#2  1  a 3 3 
#3  1  b 3 3 

あなたはマルチレベルの列を持っていない場合は、にアクセスするには、

df_out = df_in.pivot_table(values=['value'], index=['idx1', 'idx2'], columns='field') 

は、マルチレベルの列を持つデータフレームを与える:あなたは、例えば、それらにアクセスするタプルを使用することができます列、あなたが行うことができます:

df_out[('value', 'f1')] 

ができます:

#idx1 idx2 
#0  a  1 
#  b  1 
#1  a  3 
#  b  3 
#Name: (value, f1), dtype: int64 
関連する問題