Пусть df будет кадром данных следующим образом:
date text
0 2019-6-7 London is good.
1 2019-5-8 I am going to Paris.
2 2019-4-4 Do you want to go to London?
3 2019-3-7 I love Paris!
Я хотел бы добавить столбец city, в котором указан город, содержащийся в text, то есть,
date text city
0 2019-6-7 London is good. London
1 2019-5-8 I am going to Paris. Paris
2 2019-4-4 Do you want to go to London? London
3 2019-3-7 I love Paris! Paris
Как это сделать без использования lambda?






Вы можете сначала убедиться, что у вас есть список городов, а затем str.findall
df.text.str.findall('London|Paris').str[0]
Out[320]:
0 London
1 Paris
2 London
3 Paris
Name: text, dtype: object
df['city'] = df.text.str.findall('London|Paris').str[0]
@ Чан df.loc[df.groupby('city')['date'].idxmax()] :-)
Добавляя к методу @WenYoBen, если в одном тексте есть только Париж или Лондон, тогда лучше str.extract:
regex = '(London|Paris)'
df['city'] = df.text.str.extract(regex)
df
date text city
0 2019-6-7 London is good. London
1 2019-5-8 I am going to Paris. Paris
2 2019-4-4 Do you want to go to London? London
3 2019-3-7 I love Paris! Paris
И если вы хотите, чтобы все города в вашем регулярном выражении были в тексте, тогда str.extractall также является вариантом:
df['city'] = df.text.str.extractall(regex).values
df
date text city
0 2019-6-7 London is good. London
1 2019-5-8 I am going to Paris. Paris
2 2019-4-4 Do you want to go to London? London
3 2019-3-7 I love Paris! Paris
Обратите внимание, что если есть несколько совпадений, Extractall вернет список
Следующий шаг —
df.groupby('city')['date'].max(), но он содержит толькоdateиcity, но неtext. Как включить все столбцы?