首页 > 解决方案 > 在保持相同列的同时取消堆叠 Multiindex Pandas DataFrame

问题描述

我目前正在尝试从数据框中的特定列中提取文本数据并将其保存到新的数据框中。使用下面的代码片段,我可以提取我想要的模式,但对于我的生活,我无法弄清楚如何按照我喜欢的方式格式化它。我当前的数据框有一个多索引和四列,如下所示。在数据框中,每个索引对应的玩家名称在零到四个之间,我希望它们都在同一行上。在每个有多行对应于一个索引的情况下,第一行中玩家姓名上方的第二行中都有一个空白单元格,我只想合并这些行并将第一行中的空白替换为正下方的玩家姓名(如果有)。有什么办法可以做到这一点?对此的任何帮助将不胜感激。

regex_df = play_by_play_df['Play'].str.extractall(r'(\. )(.+?)( scored)|(.+?)( homered)|(.+?)( balked to score)|(.+?)( advanced on a wild pitch to score)|(.+?)( advanced on error to score)')[[1,3,5,7,9]].unstack(level='match').stack(level=0)

这是那行代码的输出。

match                0                1     2     3
2   1    Jason Heyward             None  None  None
13  1      Kolten Wong             None  None  None
38  1   Matt Carpenter             None  None  None
91  3      JD Martinez             None  None  None
94  1              NaN  Yoenis Cespedes  None  None
    3       Alex Avila              NaN  None  None
127 1  Yoenis Cespedes             None  None  None

这就是我希望我的数据框看起来的样子。

这是我想要的输出

我的最终目标是提取在给定比赛中得分的每个球员的名字,并将该名字存储在一个新列中。以下是五种不同戏剧的示例,其中包含要从中提取名称的五种独特模式:

    Play
2   Matt Holliday singled to right (Liner). Jason Heyward scored.
91  JD Martinez homered (Fly).
256 Lorenzo Cain advanced on a wild pitch to score.
331 Billy Hamilton balked to score. Joey Votto advanced to 2B.
8378 Nick Hundley advanced on error to score. DJ LeMahieu advanced to 2B on error. Error by Chris Heston.

我希望在此数据框中添加四个额外的列,每个列都包含一个得分的球员的名字(在给定的比赛中最多可以有四个球员得分)。显然会有很多空牢房,因为很少有四名球员在一场比赛中得分。

标签: pythonpandasmulti-index

解决方案


我真的很感谢所有的帮助家伙!抱歉,如果我的问题提出得不好。经过一番挖掘,我终于解决了我的问题。解决方案非常简单。

regex_df = play_by_play_df['Play'].str.extractall(r'(\. )(.+?)( scored)|(.+?)( homered)|(.+?)( balked to score)|(.+?)( advanced on a wild pitch to score)|(.+?)( advanced on error to score)')[[1,3,5,7,9]].unstack(level='match').stack(level=0).reset_index(level=1, drop=True)
regex_df = regex_df.groupby(regex_df.index).first()

我最终所做的只是删除了多索引的第一级,从而使一些行具有相同的索引。从那里,我只是使用 groupby().first() 按索引分组并将非 NaN 值强制到顶行。我的结果如下所示:

在此处输入图像描述


推荐阅读