web-dev-qa-db-fra.com

Remplissez conditionnellement les valeurs des colonnes en fonction d'une autre valeur de colonnes dans pandas

J'ai un DataFrame avec quelques colonnes. Une colonne contient un symbole pour lequel la devise est utilisée, par exemple un euro ou un signe dollar. Une autre colonne contient une valeur budgétaire. Ainsi, par exemple, dans une rangée, cela pourrait signifier un budget de 5000 euros et dans la rangée suivante, cela pourrait dire un budget de 2000 en dollars.

Dans pandas je voudrais ajouter une colonne supplémentaire à mon DataFrame, normalisant les budgets en euros. Donc, fondamentalement, pour chaque ligne, la valeur dans la nouvelle colonne doit être la valeur de la colonne budgétaire * 1 si le symbole dans la colonne monétaire est un signe euro et que la valeur dans la nouvelle colonne doit être la valeur de la colonne budgétaire * 0,78125 si le symbole dans la colonne monétaire est un signe dollar.

Je sais comment ajouter une colonne, la remplir de valeurs, copier des valeurs d'une autre colonne, etc. mais pas comment remplir la nouvelle colonne conditionnellement en fonction de la valeur d'une autre colonne.

Aucune suggestion?

30
Jan Willem Tulp

Tu veux probablement faire

df['Normalized'] = np.where(df['Currency'] == '$', df['Budget'] * 0.78125, df['Budget'])
59
Wes McKinney

Des résultats similaires via un autre style peuvent consister à écrire une fonction qui exécute l'opération souhaitée sur une ligne, à l'aide de row['fieldname'] syntaxe pour accéder aux valeurs/colonnes individuelles, puis effectuez une méthode DataFrame.apply dessus

Cela fait écho à la réponse à la question liée ici: les pandas créent une nouvelle colonne en fonction des valeurs des autres colonnes

def normalise_row(row):
    if row['Currency'] == '$'
    ...
    ...
    ...
    return result

df['Normalized'] = df.apply(lambda row : normalise_row(row), axis=1) 
7
Thomas Kimber

En poussant la suggestion de Tom Kimber un peu plus loin, vous pouvez utiliser un dictionnaire de fonctions pour définir diverses conditions pour vos fonctions. Cette solution élargit la portée de la question.

J'utilise un exemple d'une application personnelle.

# write the dictionary

def applyCalculateSpend (df_name, cost_method_col, metric_col, rate_col, total_planned_col):
    calculations = {
            'CPMV'  : df_name[metric_col] / 1000 * df_name[rate_col],
            'Free'  : 0
            }
    df_method = df_name[cost_method_col]
    return calculations.get(df_method, "not in dict")

# call the function inside a lambda

test_df['spend'] = test_df.apply(lambda row: applyCalculateSpend(
row,
cost_method_col='cost method',
metric_col='metric',
rate_col='rate',
total_planned_col='total planned'), axis = 1)

  cost method  metric  rate  total planned  spend
0        CPMV    2000   100           1000  200.0
1        CPMV    4000   100           1000  400.0
4        Free       1     2              3    0.0
5
Artem Yevtushenko