применение регулярного выражения к кадру данных pandas
У меня возникли проблемы с применением функции регулярного выражения в столбце в фрейме данных python. Вот глава моего фреймворка:
Name Season School G MP FGA 3P 3PA 3P%
74 Joe Dumars 1982-83 McNeese State 29 NaN 487 5 8 0.625
84 Sam Vincent 1982-83 Michigan State 30 1066 401 5 11 0.455
176 Gerald Wilkins 1982-83 Chattanooga 30 820 350 0 2 0.000
177 Gerald Wilkins 1983-84 Chattanooga 23 737 297 3 10 0.300
243 Delaney Rudd 1982-83 Wake Forest 32 1004 324 13 29 0.448
Я думал, что у меня довольно хорошее понимание применения функций к Dataframes, поэтому, возможно, мне не хватает навыков Regex.
Вот что я собрал:
import re
def split_it(year):
return re.findall('(\d\d\d\d)', year)
df['Season2'] = df['Season'].apply(split_it(x))
TypeError: expected string or buffer
Результатом будет столбец Season2, который содержит год перед дефисом. Я уверен, что это более простой способ сделать это без регулярного выражения, но что более важно, я пытаюсь выяснить, что я сделал неправильно
Спасибо за любую помощь заранее.
Ответы
Ответ 1
Когда я пытаюсь (вариант) вашего кода, я получаю NameError: name 'x' is not defined
- что это не так.
Вы можете использовать либо
df['Season2'] = df['Season'].apply(split_it)
или
df['Season2'] = df['Season'].apply(lambda x: split_it(x))
но второй - это просто более длинный и медленный способ записи первого, поэтому не так много смысла (если у вас нет других аргументов для обработки, которых мы не видим здесь). Ваша функция вернет список, хотя:
>>> df["Season"].apply(split_it)
74 [1982]
84 [1982]
176 [1982]
177 [1983]
243 [1982]
Name: Season, dtype: object
хотя вы можете легко изменить это. FWIW, я бы использовал векторизованные операции с строками и сделал что-то вроде
>>> df["Season"].str[:4].astype(int)
74 1982
84 1982
176 1982
177 1983
243 1982
Name: Season, dtype: int64
или
>>> df["Season"].str.split("-").str[0].astype(int)
74 1982
84 1982
176 1982
177 1983
243 1982
Name: Season, dtype: int64
Ответ 2
Заданный вопрос можно решить, написав следующий код:
import re
def split_it(year):
x = re.findall('([\d]{4})', year)
if x :
return(x.group())
df['Season2'] = df['Season'].apply(split_it)
Вы столкнулись с этой проблемой, поскольку в некоторых строках не было года в строке