Как извлечь год (или дату и время) из столбца в фрейме данных Pandas, который содержит текст - PullRequest
0 голосов
/ 15 ноября 2018

Предположим, у меня есть датафрейм для панд:

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]

Я перепутал с некоторыми другими вещами и пока не заставил его работать.Есть предложения?

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

Вы можете сделать следующее.

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}')
  1. строка: import pandas
  2. строка: создать фрейм данных для понимания
  3. строка: создатьновый столбец 'Year', который создается из извлечения строки в столбце Book.

Используйте regex, чтобы найти цифры.Я использую https://regex101.com/r/Bid0qA/1,, что очень помогает понять, как работает регулярное выражение.

0 голосов
/ 15 ноября 2018

Ответ для полной серии на самом деле так:

books['title'].str.findall('\((\d{4})\)').str.get(0)
0 голосов
/ 15 ноября 2018

Как насчет простого регулярного выражения:

text = 'Harry Potter (1997)'
re.findall('\((\d{4})\)', 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 = '\((\d{4})\)'
df['year'] = df.Book.str.extract(pattern, expand=False) #False returns a series

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

Наконец, если вы действительно хотите отделить заголовок от данных (взяв реконструкцию кадра данных от Филиппа в другом ответе):

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('(.*)\((\d{4})\)', 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...