pandas колонка из словаря
Как добавить в датафрейм новую колонку, которая будет содержать булево в зависимости от соответствия значениям из словаря?
import pandas as pd
slov={
'Группа1':('Товар1','Товар3'),
'Группа2':('Товар2','Товар3','Товар4','Товар5'),
'Группа3':('Товар1')
}
df=pd.DataFrame({
'Товар':['Товар1ac','Товар1cnj','Товар1p','Товар2xt','Товар2zrt','Товар3dg','Товар4ry'],
'Группа':['Группа1','Группа1','Группа2','Группа3','Группа1','Группа2','Группа3']
})
Что должно быть в результате:
df=pd.DataFrame({
'Товар':['Товар1ac','Товар1cnj','Товар1p','Товар2xt','Товар2zrt','Товар3dg','Товар4ry'],
'Группа':['Группа1','Группа1','Группа2','Группа3','Группа1','Группа2','Группа3'],
'Новая колонка':['ИСТИНА','ИСТИНА','ЛОЖЬ','ЛОЖЬ','ЛОЖЬ','ИСТИНА','ЛОЖЬ']
})
Этот вариант не работает, выдаёт ошибку TypeError: expected a string or tuple, not Series
df['Новая колонка']=df['Товар'].str.startswith(df['Группа'].apply(lambda x: slov.get(x)))
Ответы (1 шт):
Автор решения: black1277
→ Ссылка
Проблема с вашим кодом заключается в том, что метод startswith ожидает строку или кортеж строк, а df['Группа'].apply(lambda x: slov.get(x)) возвращает Series, что вызывает ошибку. Для создания новой колонки с булевыми значениями вам нужно будет итерировать по каждой строке датафрейма, проверяя соответствие между товарами и группами. Вот как это можно реализовать:
import pandas as pd
# Исходный словарь
slov = {
'Группа1': ('Товар1', 'Товар3'),
'Группа2': ('Товар2', 'Товар3', 'Товар4', 'Товар5'),
'Группа3': ('Товар1')
}
# Исходный датафрейм
df = pd.DataFrame({
'Товар': ['Товар1ac', 'Товар1cnj', 'Товар1p', 'Товар2xt', 'Товар2zrt', 'Товар3dg', 'Товар4ry'],
'Группа': ['Группа1', 'Группа1', 'Группа2', 'Группа3', 'Группа1', 'Группа2', 'Группа3']
})
# Функция для проверки на соответствие товара и группы
def check_item_group(item, group):
# Проверяем, если ли товар в соответствующей группе в словаре
return any(item.startswith(good) for good in slov[group])
# Добавляем новую колонку с булевыми значениями
df['Новая колонка'] = df.apply(lambda row: check_item_group(row['Товар'], row['Группа']), axis=1)
# Преобразуем булевы значения в текстовые 'ИСТИНА'/'ЛОЖЬ'
df['Новая колонка'] = df['Новая колонка'].map({True: 'ИСТИНА', False: 'ЛОЖЬ'})
print(df)