web-dev-qa-db-fra.com

Pandas: Comment puis-je utiliser la fonction apply () pour une seule colonne?

J'ai un bloc de données de pandas avec deux colonnes. Je dois modifier les valeurs de la première colonne sans affecter la seconde et récupérer l'ensemble du cadre de données avec uniquement les valeurs de la première colonne modifiées. Comment puis-je faire cela en appliquant dans les pandas?

161
Amani

Étant donné un exemple de structure de données df en tant que:

a,b
1,2
2,3
3,4
4,5

ce que tu veux c'est:

df['a'] = df['a'].apply(lambda x: x + 1)

qui retourne:

   a  b
0  2  2
1  3  3
2  4  4
3  5  5
238
Fabio Lamanna

Vous n'avez pas besoin d'une fonction du tout. Vous pouvez travailler directement sur une colonne entière.

Exemple de données:

>>> df = pd.DataFrame({'a': [100, 1000], 'b': [200, 2000], 'c': [300, 3000]})
>>> df

      a     b     c
0   100   200   300
1  1000  2000  3000

La moitié de toutes les valeurs de la colonne aname__:

>>> df.a = df.a / 2
>>> df

     a     b     c
0   50   200   300
1  500  2000  3000
34
Mike Müller

Pour une seule colonne, mieux vaut utiliser map(), comme ceci:

df = pd.DataFrame([{'a': 15, 'b': 15, 'c': 5}, {'a': 20, 'b': 10, 'c': 7}, {'a': 25, 'b': 30, 'c': 9}])

    a   b  c
0  15  15  5
1  20  10  7
2  25  30  9



df['a'] = df['a'].map(lambda a: a / 2.)

      a   b  c
0   7.5  15  5
1  10.0  10  7
2  12.5  30  9
31
George Petrov

Bien que les réponses données soient correctes, elles modifient le bloc de données initial, ce qui n’est pas toujours souhaitable (et, étant donné que le PO a demandé des exemples "avec apply", il se peut qu’ils aient voulu une version renvoyant un nouveau bloc de données, comme le fait apply ).

Ceci est possible en utilisant assign : il est valide pour assign aux colonnes existantes, comme l'indique la documentation (l'emphase est à moi):

Attribuez de nouvelles colonnes à un DataFrame.

Renvoie un nouvel objet avec toutes les colonnes d'origine en plus des nouvelles. Les colonnes existantes réattribuées seront remplacées .

En bref:

In [1]: import pandas as pd

In [2]: df = pd.DataFrame([{'a': 15, 'b': 15, 'c': 5}, {'a': 20, 'b': 10, 'c': 7}, {'a': 25, 'b': 30, 'c': 9}])

In [3]: df.assign(a=lambda df: df.a / 2)
Out[3]: 
      a   b  c
0   7.5  15  5
1  10.0  10  7
2  12.5  30  9

In [4]: df
Out[4]: 
    a   b  c
0  15  15  5
1  20  10  7
2  25  30  9

Notez que la fonction recevra l'ensemble du cadre de données, pas seulement la colonne que vous souhaitez modifier, vous devrez donc vous assurer de sélectionner la colonne de droite dans votre lambda.

1
Thibaut Dubernet

Si vous êtes vraiment préoccupé par la vitesse d'exécution de votre fonction apply et que vous avez un énorme jeu de données à utiliser, vous pouvez utiliser swifter pour accélérer l'exécution, voici un exemple pour swifter sur pandas dataframe:

import pandas as pd
import swifter

def fnc(m):
    return m*3+4

df = pd.DataFrame({"m": [1,2,3,4,5,6], "c": [1,1,1,1,1,1], "x":[5,3,6,2,6,1]})

# apply a self created function to a single column in pandas
df["y"] = df.m.swifter.apply(fnc)

Cela permettra à tous les cœurs de votre processeur de calculer le résultat et sera donc beaucoup plus rapide que les fonctions d’application normales. Essayez de me laisser savoir si cela vous est utile.

0
durjoy