Pandas Multiindex 系列级别重新索引
Posted
技术标签:
【中文标题】Pandas Multiindex 系列级别重新索引【英文标题】:Pandas Multiindex Series Level Reindex 【发布时间】:2020-05-19 08:42:11 【问题描述】:我有 ser_apl pandas.Series 和 2 级 MultiIndex:
Date Team
2013-01-31 Man Utd 11
2013-02-28 Man Utd 12
2013-03-29 Man Utd 13
2013-04-30 Man Utd 14
2013-05-31 Man Utd 15
2013-06-28 Man Utd 16
2013-07-31 Man Utd 17
2013-08-30 Man Utd 18
2013-09-30 Man Utd 19
2013-10-31 Man Utd 20
2013-11-29 Man Utd 21
2013-12-31 Man Utd 22
2013-07-31 Liverpool 37
2013-08-30 Liverpool 38
2013-09-30 Liverpool 39
2013-10-31 Liverpool 40
2013-11-29 Liverpool 41
2013-12-31 Liverpool 42
2013-01-31 Chelsea 51
2013-02-28 Chelsea 52
2013-03-29 Chelsea 53
2013-04-30 Chelsea 54
2013-05-31 Chelsea 55
2013-06-28 Chelsea 56
Name: Result, dtype: int64
我需要重新索引日期级别,以便所有团队接收:
Date Team
2013-01-31 Chelsea 51.0
2013-02-28 Chelsea 52.0
2013-03-29 Chelsea 53.0
2013-04-30 Chelsea 54.0
2013-05-31 Chelsea 55.0
2013-06-28 Chelsea 56.0
2013-07-31 Chelsea NaN
2013-08-30 Chelsea NaN
2013-09-30 Chelsea NaN
2013-10-31 Chelsea NaN
2013-11-29 Chelsea NaN
2013-12-31 Chelsea NaN
2013-01-31 Liverpool NaN
2013-02-28 Liverpool NaN
2013-03-29 Liverpool NaN
2013-04-30 Liverpool NaN
2013-05-31 Liverpool NaN
2013-06-28 Liverpool NaN
2013-07-31 Liverpool 37.0
2013-08-30 Liverpool 38.0
2013-09-30 Liverpool 39.0
2013-10-31 Liverpool 40.0
2013-11-29 Liverpool 41.0
2013-12-31 Liverpool 42.0
2013-01-31 Man Utd 11.0
2013-02-28 Man Utd 12.0
2013-03-29 Man Utd 13.0
2013-04-30 Man Utd 14.0
2013-05-31 Man Utd 15.0
2013-06-28 Man Utd 16.0
2013-07-31 Man Utd 17.0
2013-08-30 Man Utd 18.0
2013-09-30 Man Utd 19.0
2013-10-31 Man Utd 20.0
2013-11-29 Man Utd 21.0
2013-12-31 Man Utd 22.0
dtype: float64
首先我准备了索引:
idx_level_date = ser_apl.index.get_level_values('Date').unique()
然后我尝试了几种方法:
ser_apl.reindex(idx_level_date, level = 'Date')
作为替代方案:
ser_apl.groupby('Team').apply(lambda iter_team: iter_team.reindex(idx_level_date, level = 'Date'))
两者都不成功: 结果和原来的ser_apl一样。
所以我需要重新索引的帮助。
附:我在这里找到了替代的 unstack/stack 技巧:Filling in date gaps in MultiIndex Pandas Dataframe
但问题是为什么我不能用适当的方法做同样的事情?
【问题讨论】:
【参考方案1】:通过MultiIndex.from_product
创建所有可能的日期时间并传递给Series.reindex
,如有必要,通过Series.sort_index
更改排序:
mux = pd.MultiIndex.from_product(ser_apl.index.levels, names=ser_apl.index.names)
s = ser_apl.reindex(mux).sort_index(level=[1,0])
print (s)
Date Team
2013-01-31 Chelsea 51.0
2013-02-28 Chelsea 52.0
2013-03-29 Chelsea 53.0
2013-04-30 Chelsea 54.0
2013-05-31 Chelsea 55.0
2013-06-28 Chelsea 56.0
2013-07-31 Chelsea NaN
2013-08-30 Chelsea NaN
2013-09-30 Chelsea NaN
2013-10-31 Chelsea NaN
2013-11-29 Chelsea NaN
2013-12-31 Chelsea NaN
2013-01-31 Liverpool NaN
2013-02-28 Liverpool NaN
2013-03-29 Liverpool NaN
2013-04-30 Liverpool NaN
2013-05-31 Liverpool NaN
2013-06-28 Liverpool NaN
2013-07-31 Liverpool 37.0
2013-08-30 Liverpool 38.0
2013-09-30 Liverpool 39.0
2013-10-31 Liverpool 40.0
2013-11-29 Liverpool 41.0
2013-12-31 Liverpool 42.0
2013-01-31 Man Utd 11.0
2013-02-28 Man Utd 12.0
2013-03-29 Man Utd 13.0
2013-04-30 Man Utd 14.0
2013-05-31 Man Utd 15.0
2013-06-28 Man Utd 16.0
2013-07-31 Man Utd 17.0
2013-08-30 Man Utd 18.0
2013-09-30 Man Utd 19.0
2013-10-31 Man Utd 20.0
2013-11-29 Man Utd 21.0
2013-12-31 Man Utd 22.0
Name: Result, dtype: float64
【讨论】:
感谢帮助,但是 reindex 方法有什么问题? @igharok - 如果需要 MultiIndex,请使用reindex
和两个级别的 MultiIndex
@YOBEN_S 我正在结束这个案例,但 level 实际上是 reindex 方法的假参数似乎很奇怪。以上是关于Pandas Multiindex 系列级别重新索引的主要内容,如果未能解决你的问题,请参考以下文章
在 Pandas 中将两个 MultiIndex 级别合并为一个