#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)