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 系列级别重新索引的主要内容,如果未能解决你的问题,请参考以下文章

在日期为“关闭”的级别上重新索引 MultiIndex

在 pandas MultiIndex 系列中设置值

Pandas:将多索引级别作为系列

在 Pandas 中将两个 MultiIndex 级别合并为一个

Pandas DataFrame - 如何检索 MultiIndex 级别的特定组合

带有 pandas groupby multiindex 的箱线图,用于来自 multiindex 的指定子级别