我想对pandas进行一次透视DataFrame,索引是两列,而不是一列。例如,一个字段用于年份,一个字段用于月份,一个“ item”字段显示“ item 1”和“ item 2”,以及一个“ value”字段和数值。我希望索引为年+月。
DataFrame
我设法做到这一点的唯一方法是将两个字段合并为一个,然后再次将其分开。有没有更好的办法?
最少的代码复制到下面。非常感谢!
PS:是的,我知道关键字“ pivot”和“ multi-index”还有其他问题,但是我不知道他们是否/如何帮助我解决这个问题。
import pandas as pd import numpy as np df= pd.DataFrame() month = np.arange(1, 13) values1 = np.random.randint(0, 100, 12) values2 = np.random.randint(200, 300, 12) df['month'] = np.hstack((month, month)) df['year'] = 2004 df['value'] = np.hstack((values1, values2)) df['item'] = np.hstack((np.repeat('item 1', 12), np.repeat('item 2', 12))) # This doesn't work: # ValueError: Wrong number of items passed 24, placement implies 2 # mypiv = df.pivot(['year', 'month'], 'item', 'value') # This doesn't work, either: # df.set_index(['year', 'month'], inplace=True) # ValueError: cannot label index with a null key # mypiv = df.pivot(columns='item', values='value') # This below works but is not ideal: # I have to first concatenate then separate the fields I need df['new field'] = df['year'] * 100 + df['month'] mypiv = df.pivot('new field', 'item', 'value').reset_index() mypiv['year'] = mypiv['new field'].apply( lambda x: int(x) / 100) mypiv['month'] = mypiv['new field'] % 100
您可以分组然后再堆叠。
>>> df.groupby(['year', 'month', 'item'])['value'].sum().unstack('item') item item 1 item 2 year month 2004 1 33 250 2 44 224 3 41 268 4 29 232 5 57 252 6 61 255 7 28 254 8 15 229 9 29 258 10 49 207 11 36 254 12 23 209
或使用pivot_table:
pivot_table
>>> df.pivot_table( values='value', index=['year', 'month'], columns='item', aggfunc=np.sum) item item 1 item 2 year month 2004 1 33 250 2 44 224 3 41 268 4 29 232 5 57 252 6 61 255 7 28 254 8 15 229 9 29 258 10 49 207 11 36 254 12 23 209