重采样多索引DataFrame
我想对一个包含日期时间列和其他关键字段的多重索引的DataFrame进行重采样。这个DataFrame看起来是这样的:
import pandas as pd
from StringIO import StringIO
csv = StringIO("""ID,NAME,DATE,VAR1
1,a,03-JAN-2013,69
1,a,04-JAN-2013,77
1,a,05-JAN-2013,75
2,b,03-JAN-2013,69
2,b,04-JAN-2013,75
2,b,05-JAN-2013,72""")
df = pd.read_csv(csv, index_col=['DATE', 'ID'], parse_dates=['DATE'])
df.columns.name = 'Params'
因为重采样只允许在日期时间索引上进行,所以我想展开其他的索引列来解决这个问题。确实这样做有效,但我之后又无法再把它堆叠回去。
print df.unstack('ID').resample('W-THU')
Params VAR1
ID 1 2
DATE
2013-01-03 69 69.0
2013-01-10 76 73.5
但是当我尝试再次对'ID'进行堆叠时,出现了索引错误:
print df.unstack('ID').resample('W-THU').stack('ID')
IndexError: index 0 is out of bounds for axis 0 with size 0
奇怪的是,我可以同时对其他列级别进行堆叠:
print df.unstack('ID').resample('W-THU').stack(0)
还有
print df.unstack('ID').resample('W-THU').stack('Params')
如果我重新排序(交换)这两个列级别,索引错误也会出现。有没有人知道怎么解决这个问题?
1 个回答
8
这个例子中,非数字的列'NAME'被展开了,但这个列会被默默地丢掉,这在后面重新堆叠的时候会造成问题。下面的代码对我来说是有效的。
print df[['VAR1']].unstack('ID').resample('W-THU').stack('ID')
Params VAR1
DATE ID
2013-01-03 A 69.0
B 69.0
2013-01-10 A 76.0
B 73.5