#python #dataframe #for-loop #if-statement
Вопрос:
Я хочу создать функцию с циклом for, которая выполняет итерацию по небольшому фрейму данных и добавляет новый столбец с разными значениями в зависимости от заданных условий.
Я пробовал ниже, но он возвращает вывод для моего первого оператора if для всех строк (он выводит «Лучшие покупатели» для каждой строки):
def CustomerSegmentClassifier(df):
for i, row in df.iterrows():
if (df['Recency'] <= 200).any() or (df['Frequency'] >= 20).any():
df.at[i,'Cluster Name'] = 'Top Buyers'
elif (df['Recency'].between(201, 750)).any() or (df['Frequency'].between(5,19)).any():
df.at[i,'Cluster Name'] = 'Casual Buyers'
else:
df.at[i,'Cluster Name'] = 'Churned Buyers'
return df
Изображение вывода из функции CustomerSegmentClassifer
Любая помощь будет с благодарностью.
Комментарии:
1. Просто для ясности, вы используете pandas?
Ответ №1:
Избегайте циклов for по строкам для векторизованных методов. В отличие от Python общего назначения, использующего списки и dicts, pandas и numpy имеют несколько решений для условной логики в массивах и рядах.
В частности, для ваших нужд рассмотрите numpy.select
и даже используйте операторы рядов для логики неравенств:
def CustomerSegmentClassifier(df):
conditions = [
((df['Recency'].le(200)) | (df['Frequency'].ge(20))),
(
(df['Recency'].between(201, 750)) |
(df['Frequency'].between(5, 19))
)
]
values = ['Top Buyers', 'Casual Buyers']
df['Cluster Name'] = np.select(
conditions, values, default='Churned Buyers'
)
return df
Комментарии:
1. Рад помочь! Но, пожалуйста, обратите внимание на очень важное замечание об избежании циклов по строкам, которых следует избегать в pandas.
Ответ №2:
Это моя попытка решить ваш вопрос :
import pandas as pd
#df = pd.read_csv('test_data.txt', sep=',', header=None)
#df.columns = ['Customer ID','Recency','Frequency','Monetary Value']
def CustomerSegmentClassifier(df):
for i, row in df.iterrows():
if (df['Recency'][i] <= 200) or (df['Frequency'][i] >= 20):
df.at[i,'Cluster Name'] = 'Top Buyers'
elif (200 > df['Recency'][i] <= 750) or (5 > df['Frequency'][i] < 20):
df.at[i,'Cluster Name'] = 'Casual Buyers'
else:
df.at[i,'Cluster Name'] = 'Churned Buyers'
return df
CustomerSegmentClassifier(df)
Вывод: