Python - извлечение нескольких значений из строки в pandas df - PullRequest
2 голосов
/ 11 июля 2019

Я искал ответ на следующий вопрос, но пока не нашел ответа.У меня есть большой набор данных, подобный этому небольшому примеру:

df =

A  B
1  I bought 3 apples in 2013
3  I went to the store in 2020 and got milk
1  In 2015 and 2019 I went on holiday to Spain
2  When I was 17, in 2014 I got a new car
3  I got my present in 2018 and it broke down in 2019

Я хотел бы извлечь все значения> 1950 и получить его в качестве конечного результата:

A  B                                                    C
1  I bought 3 apples in 2013                            2013
3  I went to the store in 2020 and got milk             2020
1  In 2015 and 2019 I went on holiday to Spain          2015_2019
2  When I was 17, in 2014 I got a new car               2014
3  I got my present in 2018 and it broke down in 2019   2018_2019

Iсначала попытался извлечь значения, но не получил дальше, чем:

df["C"] = df["B"].str.extract('(\d+)').astype(int)
df["C"] = df["B"].apply(lambda x: re.search(r'\d+', x).group())

Но все, что я получаю, это сообщения об ошибках (я только начал python и работал с текстами несколько недель назад ..).Может ли кто-нибудь мне помочь?

Ответы [ 2 ]

3 голосов
/ 11 июля 2019

Вот один из способов, используя str.findall и соединяя те элементы из результирующих списков, которые больше 1950 ::

s = df["B"].str.findall('\d+')
df['C'] = s.apply(lambda x: '_'.join(i for i in x if int(i)> 1950))

   A                                                  B          C
0  1                          I bought 3 apples in 2013       2013
1  3           I went to the store in 2020 and got milk       2020
2  1        In 2015 and 2019 I went on holiday to Spain  2015_2019
3  2             When I was 17, in 2014 I got a new car       2014
4  3  I got my present in 2018 and it broke down in ...  2018_2019
1 голос
/ 11 июля 2019

С одним шаблоном регулярных выражений (с учетом вашего комментария " нужен год это произошло "):

In [268]: pat = re.compile(r'\b(19(?:[6-9]\d|5[1-9])|[2-9]\d{3})')

In [269]: df['C'] = df['B'].apply(lambda x: '_'.join(pat.findall(x)))

In [270]: df
Out[270]: 
   A                                                  B          C
0  1                          I bought 3 apples in 2013       2013
1  3           I went to the store in 2020 and got milk       2020
2  1        In 2015 and 2019 I went on holiday to Spain  2015_2019
3  2             When I was 17, in 2014 I got a new car       2014
4  3  I got my present in 2018 and it broke down in ...  2018_2019
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...