Как создать новый столбец с несколькими значениями в фрейме данных python, используя цикл for?

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

Вывод:

выходной сигнал