определить функцию, которая принимает 2 входных данных в Python

#python #python-3.x #pandas

#python #python-3.x #pandas

Вопрос:

Я хотел бы создать новый столбец, в котором столбец принимает 2 входных данных: last_purchase_in_days и order_count .

Код:

 def segmentor(last_purchase_in_days,order_count):
    if (customer_df['last_purchase_in_days'] <= 30) amp; (customer_df['order_count']>=4):
        return 'best',
    elif (customer_df['last_purchase_in_days'] <=180) amp; (customer_df['order_count']>=4):
        return 'loyal',
    elif (customer_df['last_purchase_in_days'] <=30) amp; (customer_df['order_count']==1):
        return 'recent',
    elif (customer_df['last_purchase_in_days'] <=180) amp; (customer_df['order_count']==1): 
        return 'defecting',
    elif (customer_df['last_purchase_in_days'] <=180) amp; (customer_df['order_count']<=3):
        return 'promising',
    elif (customer_df['last_purchase_in_days'] <=360):
        return 'at_risk',
    elif (customer_df['last_purchase_in_days'] >=360):
        return 'dormant',
    else: 
        return '???'

customer_df['segment']=customer_df.apply(lambda x: segmentor(x)
 

Ошибка: TypeError: segmentor() missing 1 required positional argument: 'order_count'.

#Я не ставлю последний elif в else: return ‘неактивный’, потому что я хочу проверить, есть ли что-то, что я пропустил.

 customer_df.dtypes
last_purchase_in_days    int64
order_count              int64
 

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

1. x.segmentor вероятно, должно быть segmentor(x)

2. Ошибка значения: значение истинности ряда неоднозначно. Используйте .empty , .bool() , .item(), .any() или.all() .

3. Вы не используете x в своей функции

4. пересмотрел код, проблема все еще не решена.

5. После этого вам не хватает a ) в конце segmentor(x) .

Ответ №1:

apply Метод выполняется для каждого столбца, а не для каждой строки, поэтому вы должны добавить axis аргумент. Затем вы segmentor должны работать со строкой, а не со всем фреймом данных.

 import pandas
import random

# Create some test data
my_df = pandas.DataFrame(
    [
        {
            "last_purchase_in_days": random.randint(0, 720),
            "order_count": random.randint(0, 6),
        }
        for _ in range(1000)
    ]
)


def segmentor(row):
    if (row["last_purchase_in_days"] <= 30) amp; (row["order_count"] >= 4):
        return "best"
    elif (row["last_purchase_in_days"] <= 180) amp; (row["order_count"] >= 4):
        return "loyal"
    elif (row["last_purchase_in_days"] <= 30) amp; (row["order_count"] == 1):
        return "recent"
    elif (row["last_purchase_in_days"] <= 180) amp; (row["order_count"] == 1):
        return "defecting"
    elif (row["last_purchase_in_days"] <= 180) amp; (row["order_count"] <= 3):
        return "promising"
    elif row["last_purchase_in_days"] <= 360:
        return "at_risk"
    elif row["last_purchase_in_days"] >= 360:
        return "dormant"

my_df["segment"] = my_df.apply(lambda x: segmentor(x), axis=1)