web-dev-qa-db-fra.com

Comment appliquer une fonction personnalisée au bloc de données pandas pour chaque ligne

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'?

6
zorny

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_popet growth_rate

def final_pop(row):
    return row.initial_pop*math.e**(row.growth_rate*35)
7
Boud

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".

5
Karnage

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.

2
Mr. Duhart

Votre fonction,

def function(x):
  // your operation
  return x

appelez votre fonction en tant que,

df['column']=df['column'].apply(function)
1
syed irfan