如何从包含文本的熊猫数据框中的列中提取年份(或日期时间)

Posted

技术标签:

【中文标题】如何从包含文本的熊猫数据框中的列中提取年份(或日期时间)【英文标题】:How to extract year (or datetime) from a column in a pandas dataframe that contains text 【发布时间】:2019-04-18 21:27:16 【问题描述】:

假设我有一个 pandas 数据框:

Id    Book                      
1     Harry Potter (1997)
2     Of Mice and Men (1937)
3     Babe Ruth Story, The (1948)   Drama   948)    Babe Ruth Story

如何从列中提取年份?

输出应该是:

Id    Book Title               Year
1     Harry Potter             1997
2     Of Mice and Men          1937
3     Babe Ruth Story, The     1948

到目前为止我已经尝试过:

movies['year'] = movies['title'].str.extract('([0-9(0-9)]+)', expand=False).str.strip()

books['year'] = books['title'].str[-5:-1]

我搞砸了一些其他的事情,还没有让它工作。有什么建议吗?

【问题讨论】:

【参考方案1】:

一个简单的正则表达式怎么样:

text = 'Harry Potter (1997)'
re.findall('\((\d4)\)', text)
# ['1997'] Note that this is a list of "all" the occurrences.

使用 Dataframe,可以这样做:

text = 'Harry Potter (1997)'
df = pd.DataFrame('Book': text, index=[1])
pattern = '\((\d4)\)'
df['year'] = df.Book.str.extract(pattern, expand=False) #False returns a series

df
#                  Book   year
# 1  Harry Potter (1997)  1997

最后,如果您真的想将标题和数据分开(在另一个答案中从 Philip 那里重建数据框):

df = pd.DataFrame(columns=['Book'], data=[['Harry Potter (1997)'],['Of Mice and Men (1937)'],['Babe Ruth Story, The (1948)   Drama   948)    Babe Ruth Story']])

sep = df['Book'].str.extract('(.*)\((\d4)\)', expand=False)

sep # A new df, separated into title and year
#                       0      1                           
# 0          Harry Potter   1997 
# 1       Of Mice and Men   1937
# 2  Babe Ruth Story, The   1948

【讨论】:

不错!这几乎就是我想要的。如果我这样做,我将不得不使用 for 循环遍历 pandas 系列中的所有值,这非常慢。这帮助我得到了正确的答案,即:books['title'].str.findall('((\d4))').str.get(0) 哎呀,我的意思是 df['Books']。我会将您的答案标记为正确。 @MattElgazar 查看我的最新更新以提取标题 =) 感谢有趣的问题;我学到了一些东西来解决这个问题【参考方案2】:

您可以执行以下操作。

import pandas as pd
df = pd.DataFrame(columns=['id','Book'], data=[[1,'Harry Potter (1997)'],[2,'Of Mice and Men (1937)'],[3,'Babe Ruth Story, The (1948)   Drama   948)    Babe Ruth Story']])

df['Year'] = df['Book'].str.extract(r'(?!\()\b(\d+)1')
    行:导入熊猫 行:创建数据框以方便理解 行:创建一个新列“Year”,该列是从 Book 列上提取的字符串创建的。

使用正则表达式查找数字。我使用https://regex101.com/r/Bid0qA/1,这对理解正则表达式的工作方式有很大帮助。

【讨论】:

这实际上适用于我提出的案例,但不适用于所有案例。请参阅此示例。一些书名 2 (2002) 嗯,我正要给你写信。它确实奏效了。发布更多数据,以便我们有更多的工作。如果您在此过程中添加更多案例,那么实际回答问题会变得更加困难。我已经更新了答案【参考方案3】:

完整系列的答案实际上是这样的:

books['title'].str.findall('\((\d4)\)').str.get(0)

【讨论】:

以上是关于如何从包含文本的熊猫数据框中的列中提取年份(或日期时间)的主要内容,如果未能解决你的问题,请参考以下文章

如何从熊猫数据框中提取首字母缩写词和缩写词?

如何从熊猫数据框中的列中删除字符串值

从列中提取日期并在 R 中缺少年份时添加年份

熊猫从日期范围列中提取开始和结束日期[重复]

确定熊猫数据框中的列值何时更改

如何从python中的pandas数据框中的列中提取关键字(字符串)