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?
É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
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 a
name__:
>>> df.a = df.a / 2
>>> df
a b c
0 50 200 300
1 500 2000 3000
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
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.
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.