Фрейм данных: добавьте перечисленные значения в новый столбец из функции if else

#python #python-3.x #dataframe

#python #python-3.x #фрейм данных

Вопрос:

Я ищу, присвоена ли категория моему customer_id на основе условия. Как задать значения в новых столбцах из этой функции :

 # customers categories based on rfm segmentation
cat = ["champion", "loyal", "big spenders", "almost lost", "hibernating", "lost cheap", "uncategorized"]

def customers_cat(rfm, f, m):
    if rfm == '444':
        return cat[0]
    if f == 4:
       return cat[1]
    if m == 4 :
       return cat[2]
    if rfm == '244':
        return cat[3]
    if rfm == '144':
        return cat[4]
    if rfm == '111':
        return cat[5]
    else:
        return cat[6]
  

Чего бы я хотел :
Мой фрейм данных df_cat получает новый столбец df_cat[‘categories’], где значения соответствуют списку cat на основе условия в функции.

 df_cat['categories'] = customers_cat(df_cat['rfm_score'],
df_cat['f_score'],
df_cat['m_score'])
  

Ошибка =>

 ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
  

Комментарии:

1. Прямо сейчас вы сравниваете целую серию с числом в вашей функции

2. я не совсем понимаю вашу if else логику

3. Возможно, мне следует добавить предыдущий код, ответ Nihal позволяет добавлять значения.

Ответ №1:

это приведет к чтению фрейма данных строка за строкой. axis=1 если вам нужна строка за строкой, используйте:

 df_cat['categories'] = df_cat.apply(lambda row: customers_cat(row['rfm_score'],row['f_score'],row['m_score']), axis=1)
  

если вы используете только один столбец, тогда вы можете использовать.

 df_cat['categories'] = df_cat['rfm_score'].apply(lambda row: customers_cat(row), axis=0)