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)
→ Ссылка