Jak vytvořit nový sloupec s více hodnotami v pythonu datovém pomocí smyčky for?

0

Otázka

Chci vytvořit funkci pro loop, která iteruje přes malé datovém a přidá nový sloupec s různými hodnotami v závislosti na podmínkách stanovených.

Zkoušel jsem níže, ale to se vrátí výstup pro můj první pokud prohlášení pro všechny řádky (to vytiskne 'Top Kupce pro každý řádek):

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

Obraz Výstup z CustomerSegmentClassifer Funkce

Jakýkoliv pomoci chtěl bych být ocenil.

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

Nejlepší odpověď

1

Vyhněte se pro-smyčky přes řádky pro vectorized metody. Na rozdíl od obecné účely Python pomocí seznamů a dicts, pandy a numpy mít několik řešení pro podmíněné logiky na pole a série.

Konkrétně pro vaše potřeby, zvažte numpy.select a dokonce použít Řadu operátorů pro nerovnost logika:

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

Rádi pomůžeme! Ale věnujte, prosím, pozornost je velmi důležitá poznámka vyhnout řádek-moudrý smyček, které je třeba se vyhnout v pand.
Parfait
0

Tohle je můj pokus vyřešit otázku :

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)

Výstup:

output

2021-11-24 03:27:07

V jiných jazycích

Tato stránka je v jiných jazycích

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