繁体   English   中英

Pandas df.pivot()和pd.pivot_table()具有多个索引

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM