【发布时间】:2019-06-29 10:28:43
【问题描述】:
我目前正在尝试从数据框中的特定列中提取文本数据并将其保存到新的数据框中。使用下面的代码 sn-p 我可以提取我想要的模式,但是对于我的生活,我无法弄清楚如何按照我喜欢的方式格式化它。我当前的数据框有一个多索引和四列,如下所示。在数据框中,每个索引对应的玩家名称在零到四个之间,我希望它们都在同一行。在每个有多行对应于一个索引的情况下,第一行在第二行的玩家姓名上方有一个空白单元格,我只想合并这些行并将第一行中的空白替换为正下方的玩家姓名(如果有)。有什么办法可以做到这一点?对此的任何帮助将不胜感激。
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.
我希望在此数据框中添加四个额外的列,每个列都包含一个得分的球员的姓名(在给定的比赛中最多可以有四个球员得分)。显然会有很多空单元,因为很少有四名球员在一场比赛中得分。
【问题讨论】:
-
你能举例说明你的输入是什么样的,以及想要的输出吗?
-
我编辑了我的问题,添加了我想要的输出。如果我误解了您的要求,我深表歉意。
-
你能粘贴一些文本数据吗?仅从图像很难重现该问题
-
@ALollz 加上
df = df[0].replace('', np.nan),df = df.dropna(subset=[0]) -
我认为您应该提供一个minimal reproducible example,其中包含一些在正则表达式之前开始的数据以及您需要获得的结果。通过在
regex中定义捕获组的方式可以解决很多问题,但是在不知道输出列的含义或输入是什么的情况下,这似乎只是对另一个问题的创可贴修复。
标签: python pandas multi-index