虽然我仍然熟悉大熊猫,但我正在尝试了解如何在使用包含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位