Понимание списка для pandas: если столбец в pandas содержит строку, вернуть новый столбец со строкой - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь перейти на более pythoni c способ написания моего кода, например, понимание списка. Здесь я пытаюсь создать новый столбец «Tag», который возвращает элемент списка, если этот элемент содержится в столбце Pandas согласно dataframe news_df_output.

news = {'Text':['Nike invests in shoes', 'Adidas invests in t-shirts', 'dog drank water'], 'Source':['NYT', 'WP', 'Guardian']}
news_df = pd.DataFrame(news)
buyer = ['Amazon', "Adidas", 'Walmart', 'Children Place', 'Levi',  'VF']

# news_df['Tag'] = [x for x in buyer if news_df['Text'].str.contains(x) else 'n/a']

output_news = {'Text':['Nike invests in shoes', 'Adidas invests in t-shirts', 'dog drank water'], 'Source':['NYT', 'WP', 'Guardian'], 'Tag':['n/a', 'Adidas', 'n/a']}
news_df_output = pd.DataFrame(output_news)
news_df_output

Однако мой код возвращает неверный синтаксис.

В чем здесь проблема?

1 Ответ

1 голос
/ 08 апреля 2020

Вы можете объединить значения списка с помощью | для регулярного выражения or и использовать Series.str.extract:

news_df['Tag'] = news_df['Text'].str.extract('(' + '|'.join(buyer) + ')')

print (news_df)
                         Text    Source     Tag
0       Nike invests in shoes       NYT     NaN
1  Adidas invests in t-shirts        WP  Adidas
2             dog drank water  Guardian     NaN

Ваше решение для всех совпадений возможно изменить с другим понимание вложенного списка:

news_df['Tag'] = [[y for y in buyer if y in x] for x in news_df['Text']]

print (news_df)
                         Text    Source       Tag
0       Nike invests in shoes       NYT        []
1  Adidas invests in t-shirts        WP  [Adidas]
2             dog drank water  Guardian        []

Или для первого совпадения используйте next с iter для возможного набора NaN, если нет совпадения:

news_df['Tag'] = [next(iter([y for y in buyer if y in x]), np.nan) for x in news_df['Text']]
print (news_df)
                         Text    Source     Tag
0       Nike invests in shoes       NYT     NaN
1  Adidas invests in t-shirts        WP  Adidas
2             dog drank water  Guardian     NaN
...