PeriodIndex的DataFrame.reset.index引发ValueError

时间:2014-10-05 21:47:56

标签: python pandas

虽然我仍然熟悉大熊猫,但我正在尝试了解如何在使用包含PeriodIndex的MultiIndex的DataFrame时填写时间序列中的空白。我使用this question作为指南。

以下是一个示例DataFrame:

df = pd.DataFrame({'R': ['R1'] * 4 + ['R2'] * 2,
'B': ['B1'] * 2 + ['B2'] * 1 + ['B3'] * 2 + ['B1'],
'Date': ["2014-09-29",
"2014-10-06",
"2014-10-13",
"2014-10-20",
"2014-11-03",
"2014-11-10"],
'V1': [11, 12, 13,  14,  15, 16],
'V2': [20, 19, 18,  17,  16, 15]})
df = df[['R','B','Date','V1', 'V2']]
df

输出:

    R   B        Date  V1  V2
0  R1  B1  2014-09-29  11  20
1  R1  B1  2014-10-06  12  19
2  R1  B2  2014-10-13  13  18
3  R1  B3  2014-10-20  14  17
4  R2  B3  2014-11-03  15  16
5  R2  B1  2014-11-10  16  15

这里是PeriodIndex的设置。 请注意,如果使用DateInIn而不是PeriodIndex,则reset_index将按预期工作。

df.Date = df['Date'].apply(lambda x: pd.to_datetime(x))
df.Date = df['Date'].apply(lambda x: x.to_period('W'))
df['Date'] = pd.PeriodIndex(df['Date'], freq='W') # <-- This is the line that gives problems at reset_index stage
# df['Date'] = pd.DatetimeIndex(df['Date']) # <-- No problems with reset_index if this line is used instead of the above
print '1.type of df.Date: {}'.format(type(df.Date))
print '2.df.Date.dtype: {}'.format(df.Date.dtype)
print '3.type of df.Date[0]: {}'.format(type(df.Date[0]))

输出:

1.type of df.Date: <class 'pandas.core.series.Series'>
2.df.Date.dtype: object
3.type of df.Date[0]: <class 'pandas.tseries.period.Period'>

其余代码几乎与上述帖子相同:

df.set_index(['R', 'B', 'Date'], inplace=True)
df = df.unstack(['R', 'B']).stack(['R', 'B'], dropna=False)  # don't drop NANs 
df.reset_index(inplace=True)

错误:

d:\Anaconda\envs\py2k\lib\site-packages\pandas\core\frame.pyc in _sanitize_column(self, key, value)
   2139         elif isinstance(value, Index) or _is_sequence(value):
   2140             if len(value) != len(self.index):
-> 2141                 raise ValueError('Length of values does not match length of '
   2142                                  'index')
   2143 

ValueError: Length of values does not match length of index

实际上,在PeriodIndex df.reset_index(level=[1,2], inplace=True)以外的级别上重置索引可以正常工作。

所以问题是,如果这实际上是reset_index作为PeriodIndex的一部分应用于MultiIndex的预期行为,或者代码中是否存在需要修复的内容?< / p>

提前致谢。 技术信息: Python 2.7.8。 IPython 2.3.0 pandas 0.14.1 numpy 1.9.0 编译器:MSC v.1500 64位(AMD64),系统:Windows,发布:8,机器:AMD64,解释器:64位

0 个答案:

没有答案