在保持相同列的同时拆开Multiindex Pandas DataFrame的堆栈

时间:2019-02-05 14:58:13

标签: python pandas multi-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)

这是该行代码的输出。

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

这就是我希望数据框的外观。

This is my desired output

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

    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.

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

1 个答案:

答案 0 :(得分:0)

我非常感谢所有帮助人员!抱歉,我的问题提出得不好。经过一些挖掘之后,我终于解决了我的问题。该解决方案非常简单。

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值强制放入第一行。我的结果看起来像这样:

enter image description here