重采样多索引DataFrame

7 投票
1 回答
2759 浏览
提问于 2025-04-17 20:13

我想对一个包含日期时间列和其他关键字段的多重索引的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

撰写回答