Заполнение столбца датафрейма строковыми данными из другого столбца, а не списком
Есть датасет.
В нем необходимо в столбце 'body' слова, начинающиеся с символа "#", записать с столбец 'rubric' строкой. Если этих слов несколько, то они должны быть разделены запятой.
Я использую разные коды, например:
import pandas as pd
import re
df = pd.read_csv('SB.csv', encoding = 'utf-16')
df['rubric'] = df['body'].apply(lambda x: re.findall('#\w+', x))
df.head()
передает в столбец датафрейма список из одного или нескольких элементов, а нужна строка. Пример выдачи такого кода:
[#В_закладки_Skillbox, #Skillbox_дизайн]
Код
def rubric(x):
all_tag = re.findall('#\w+', x)
for tag in all_tag:
return tag
df['rubric'] = df['body'].apply(lambda x: rubric(x))
df.head(19)
передает в столбец строку, но всегда только из одного элемента. Пример выдачи такого кода:
[#В_закладки_Skillbox]
Желаемый результат:
#В_закладки_Skillbox, #Skillbox_дизайн
Ответы (1 шт):
Используйте
df['rubric'] = df['body'].str.findall(r'#\w+').str.join(', ')
Если есть необходимость найти только отдельные слова, можно использовать следующие варианты:
df['rubric'] = df['body'].str.findall(r'(?<!\S)#\w+').str.join(', ') # после пробелов
df['rubric'] = df['body'].str.findall(r'\B#\w+').str.join(', ') # после пунктуации и пробелов
Если в хэштегах есть дефисы, используйте
df['rubric'] = df['body'].str.findall(r'#[\w-]+').str.join(', ')
Пример использования:
import pandas as pd
df = pd.DataFrame({'body':['Some #word #here', 'Текст #вася_пупкин, #zmej-gorynych,#baba-yaga', 'Wiadomość od #łajdak123']})
df['rubric'] = df['body'].str.findall(r'#[\w-]+').str.join(', ')
df['rubric']
# 0 #word, #here
# 1 #вася_пупкин, #zmej-gorynych, #baba-yaga
# 2 #łajdak123