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?
Tu veux probablement faire
df['Normalized'] = np.where(df['Currency'] == '$', df['Budget'] * 0.78125, df['Budget'])
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)
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