применение регулярного выражения к кадру данных 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)

Вы столкнулись с этой проблемой, поскольку в некоторых строках не было года в строке