[英]Pandas df.pivot() and pd.pivot_table() with multiple indexes
我正在尝试将带有多个索引的长格式df转换为宽格式df。 为什么df_in.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']
要避免使用多级列,请将值列显式指定为字符串而不是列表就足够了:
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')
给出一个带有多级列的数据框,要访问f1
列,你可以这样做:
df_out[('value', 'f1')]
得到:
#idx1 idx2
#0 a 1
# b 1
#1 a 3
# b 3
#Name: (value, f1), dtype: int64
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.