Cum de a crea o nouă coloană cu mai multe valori în python dataframe folosind pentru bucla?

0

Problema

Vreau să creez o funcție cu o buclă pentru care reiterează printr-un mic dataframe și adaugă o nouă coloană cu valori diferite în funcție de condițiile stabilite.

Am încercat de mai jos, dar se întoarce de ieșire pentru prima mea declarație în cazul în care pentru toate rândurile (se imprimă Top Cumpărătorilor pentru fiecare rând):

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

Imaginea de Ieșire din CustomerSegmentClassifer Funcție

Orice ajutor ar fi apreciat foarte mult.

dataframe for-loop if-statement python
2021-11-24 02:03:09
2

Cel mai bun răspuns

1

Pentru a evita-bucle peste rânduri pentru vectorized metode. Spre deosebire de uz general Python folosind liste și dicts, panda și numpy au mai multe soluții pentru logica condiționată pe tablouri și de serie.

În mod special, pentru nevoile tale ia în considerare numpy.select și chiar folosi Serie de operatori pentru inegalitatea logica:

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 

2021-11-24 04:02:41

Bucuros să vă ajute! Dar, te rog, aminte foarte important act de evitarea rând, înțelept bucle care ar trebui să fie evitate în panda.
Parfait
0

Acest lucru este meu de a încerca să rezolve întrebarea ta :

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)

Ieșire:

output

2021-11-24 03:27:07

În alte limbi

Această pagină este în alte limbi

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................