首页 > 解决方案 > 从字符串电影名称的列中提取年份

问题描述

我有以下数据,在名为 train_df 的表中有两列,“name”和“gross”:

gross       name
760507625.0 Avatar (2009)
658672302.0 Titanic (1997)
652270625.0 Jurassic World (2015)
623357910.0 The Avengers (2012)
534858444.0 The Dark Knight (2008)
532177324.0 Rogue One (2016)
474544677.0 Star Wars: Episode I - The Phantom Menace (1999)
459005868.0 Avengers: Age of Ultron (2015)
448139099.0 The Dark Knight Rises (2012)
436471036.0 Shrek 2 (2004)
424668047.0 The Hunger Games: Catching Fire (2013)
423315812.0 Pirates of the Caribbean: Dead Man's Chest (2006)
415004880.0 Toy Story 3 (2010)
409013994.0 Iron Man 3 (2013)
408084349.0 Captain America: Civil War (2016)
408010692.0 The Hunger Games (2012)
403706375.0 Spider-Man (2002)
402453882.0 Jurassic Park (1993)
402111870.0 Transformers: Revenge of the Fallen (2009)
400738009.0 Frozen (2013)
381011219.0 Harry Potter and the Deathly Hallows: Part 2 (2011)
380843261.0 Finding Nemo (2003)
380262555.0 Star Wars: Episode III - Revenge of the Sith (2005)
373585825.0 Spider-Man 2 (2004)
370782930.0 The Passion of the Christ (2004)

我想从“name”中读取并提取日期以创建一个名为“year”的新列,然后我将使用它来按特定年份过滤数据集。新表如下所示:

year    gross   name
2009    760507625.0 Avatar (2009)
1997    658672302.0 Titanic (1997)
2015    652270625.0 Jurassic World (2015)
2012    623357910.0 The Avengers (2012)
2008    534858444.0 The Dark Knight (2008)

我尝试了 apply 和 lambda 方法,但没有得到任何结果:

train_df[train_df.apply(lambda row: row['name'].startswith('2014'),axis=1)]

有没有办法使用包含(如在 C# 或“isin”中过滤 python 中的字符串?

标签: pythonpandasdataframe

解决方案


您可以为此使用正则表达式pandas.Series.str.extract

df["year"] = df["name"].str.extract(r"\((\d{4})\)$", expand=False)
df["year"] = pd.to_numeric(df["year"])

print(df.head())
         gross                    name  year
0  760507625.0           Avatar (2009)  2009
1  658672302.0          Titanic (1997)  1997
2  652270625.0   Jurassic World (2015)  2015
3  623357910.0     The Avengers (2012)  2012
4  534858444.0  The Dark Knight (2008)  2008

正则表达式:

  • \(: 找到有文字左括号的地方
  • (\d{4})然后,找到彼此相邻出现的 4 个数字
    • 这里的括号表示我们将 4 位数字存储为捕获组(在这种情况下,它是我们要从较大字符串中提取的数字组)
  • \): 然后,找到一个右括号
  • $:以上所有内容必须出现在字符串的末尾

当满足上述所有条件时,获取这 4 位数字,或者如果未获得匹配项,则返回该行的 NaN。


推荐阅读