Я хочу извлечь год из столбца фрейма данных data3['CopyRight'].
CopyRight
2015 Sony Music Entertainment
2015 Ultra Records , LLC under exclusive license
2014 , 2015 Epic Records , a division of Sony Music Entertainment
Compilation ( P ) 2014 Epic Records , a division of Sony Music Entertainment
2014 , 2015 Epic Records , a division of Sony Music Entertainment
2014 , 2015 Epic Records , a division of Sony Music Entertainment
Я использую приведенный ниже код для извлечения года:
data3['CopyRight_year'] = data3['CopyRight'].str.extract('([0-9]+)', expand=False).str.strip()
с моим кодом я получаю только первое появление года.
CopyRight_year
2015
2015
2014
2014
2014
2014
Я хочу извлечь все годы, упомянутые в столбце.
Ожидаемый результат
CopyRight_year
2015
2015
2014,2015
2014
2014,2015
2014,2015






Ваше текущее регулярное выражение будет просто фиксировать цифру, и если вы хотите фиксировать годы, разделенные запятыми, вам нужно будет улучшить свое регулярное выражение до этого,
[0-9]+(?:\s+,\s+[0-9]+)*
Это регулярное выражение [0-9]+ будет соответствовать числам, и, кроме того, регулярное выражение (?:\s+,\s+[0-9]+)* будет соответствовать одному или нескольким пробелам, за которыми следует запятая, снова следует один или несколько пробелов, а затем, наконец, число и целое число ноль или более раз, как доступно в данных.
Измените свою строку данных panda на это,
data3['CopyRight_year'] = data3['CopyRight'].str.extract('([0-9]+(?:\s+,\s+[0-9]+)*)', expand=False).str.replace('\s+','')
Принты,
CopyRight CopyRight_year
0 2015 Sony Music Entertainment 2015
1 2015 Ultra Records , LLC under exclusive license 2015
2 2014 , 2015 Epic Records , a 1999 division of ... 2014,2015
3 Compilation ( P ) 2014 Epic Records , a divisi... 2014
4 2014 , 2015 Epic Records , a division of Sony ... 2014,2015
5 2014 , 2015 Epic Records , a division of Sony ... 2014,2015
Хотя мне понравился ответ jezrael, в котором используются findall и join, что дает вам большую гибкость и более чистый подход.
Используйте findall с регулярным выражением для поиска всех целых чисел с длиной 4 в списках и последним join по разделителю:
Спасибо @Wiktor Stribiżew за идею добавить границу слова r'\b\d{4}\b':
data3['CopyRight_year'] = data3['CopyRight'].str.findall(r'\b\d{4}\b').str.join(',')
print (data3)
CopyRight CopyRight_year
0 2015 Sony Music Entertainment 2015
1 2015 Ultra Records , LLC under exclusive license 2015
2 2014 , 2015 Epic Records , a division of Sony ... 2014,2015
3 Compilation ( P ) 2014 Epic Records , a divisi... 2014
4 2014 , 2015 Epic Records , a division of Sony ... 2014,2015
5 2014 , 2015 Epic Records , a division of Sony ... 2014,2015
@jezrael - Большое спасибо, я получаю ожидаемый результат.
Я бы использовал
r'\b\d{4}\b', так как'(\d{4})'будет соответствовать фрагментам из 4 цифр даже внутри фрагментов с более длинными цифрами (например,0067в006789).