Je souhaite appliquer une fonction personnalisée et créer une colonne dérivée appelée population2050 basée sur deux colonnes déjà présentes dans mon bloc de données.
import pandas as pd
import sqlite3
conn = sqlite3.connect('factbook.db')
query = "select * from facts where area_land =0;"
facts = pd.read_sql_query(query,conn)
print(list(facts.columns.values))
def final_pop(initial_pop,growth_rate):
final = initial_pop*math.e**(growth_rate*35)
return(final)
facts['pop2050'] = facts['population','population_growth'].apply(final_pop,axis=1)
Lorsque je lance le code ci-dessus, j'obtiens une erreur. Est-ce que je n'utilise pas correctement la fonction 'appliquer'?
Appliquer vous fera passer le long de la ligne entière avec axe = 1. Ajustez comme ceci en supposant que vos deux colonnes s'appellent initial_pop
et growth_rate
def final_pop(row):
return row.initial_pop*math.e**(row.growth_rate*35)
Vous étiez presque là:
facts['pop2050'] = facts.apply(lambda row: final_pop(row['population'],row['population_growth']),axis=1)
L'utilisation de lambda vous permet de conserver les paramètres spécifiques (intéressants) répertoriés dans votre fonction, plutôt que de les regrouper dans une "ligne".
Vous pouvez obtenir le même résultat sans avoir besoin de DataFrame.apply()
. Les séries de Pandas (ou les colonnes de structure de données) peuvent être utilisées comme arguments directs pour les fonctions NumPy et même pour les opérateurs Python intégrés, appliqués élément par élément. Dans votre cas, c'est aussi simple que ce qui suit:
import numpy as np
facts['pop2050'] = facts['population'] * np.exp(35 * facts['population_growth'])
Ceci multiplie chaque élément de la colonne population_growth
, applique la fonction exp()
de numpy à cette nouvelle colonne (35 * population_growth
) puis ajoute le résultat avec population
.
Votre fonction,
def function(x):
// your operation
return x
appelez votre fonction en tant que,
df['column']=df['column'].apply(function)