我想扩展多索引内的日期时间索引。但是,无法将level
传递给reindex
。例如,这是一个包含多索引的系列。我想重新索引日期级别(日期时间索引),以将其延长一个月。
import numpy as np
import pandas as pd
category_idx = pd.Index(['A', 'B'])
date_idx = pd.date_range('2018-01', '2018-02', freq='MS')
idx = pd.MultiIndex.from_product([category_idx, date_idx], names=['category', 'date'])
series = pd.Series(np.random.randn(len(category_idx) * len(date_idx)), index=idx)
series
# category date
# A 2018-01-01 1.052776
# 2018-02-01 -0.032686
# B 2018-01-01 1.745934
# 2018-02-01 -0.759375
# dtype: float64
这是新的日期级别,延长了一个月。
new_date_idx = date_idx.union([date_idx[-1] + date_idx.freq])
new_date_idx
# DatetimeIndex(['2018-01-01', '2018-02-01', '2018-03-01'], dtype='datetime64[ns]', freq='MS')
我希望以下内容能显示该系列有两行,每行包含NaN
。但是,什么都没有改变。
series.reindex(index=new_date_idx, level='date')
# category date
# A 2018-01-01 1.052776
# 2018-02-01 -0.032686
# B 2018-01-01 1.745934
# 2018-02-01 -0.759375
# dtype: float64
我希望该行为与为索引重新编制索引相同。
# series.loc['A'].reindex(index=new_date_idx)
# 2018-01-01 1.052776
# 2018-02-01 -0.032686
# 2018-03-01 NaN
# Freq: MS, dtype: float64
答案 0 :(得分:0)
看起来像个错误,新的MultiIndex
中也有新值,只有未添加的代码:
s = series.reindex(index=new_date_idx, level='date')
print (s.index)
MultiIndex(levels=[['A', 'B'], [2018-01-01 00:00:00,
2018-02-01 00:00:00,
2018-03-01 00:00:00]],
codes=[[0, 0, 1, 1], [0, 1, 0, 1]],
names=['category', 'date'])
可能的解决方案是reindex
的{{1}}:
MultiIndex
或者mux = pd.MultiIndex.from_product([series.index.levels[0], new_date_idx],
names=series.index.names)
s = series.reindex(mux)
print (s)
category date
A 2018-01-01 0.125677
2018-02-01 0.623794
2018-03-01 NaN
B 2018-01-01 0.175913
2018-02-01 0.711070
2018-03-01 NaN
dtype: float64
print (s.index)
MultiIndex(levels=[['A', 'B'], [2018-01-01 00:00:00,
2018-02-01 00:00:00,
2018-03-01 00:00:00]],
codes=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2]],
names=['category', 'date'])
,unstack
和reindex
:
stack