Pouvez-vous me dire quand utiliser ces méthodes de vectorisation avec des exemples basiques?
Je vois que map
c'est une Series
méthode alors que les autres sont des DataFrame
méthodes. Cependant, je me suis trompé apply
et les applymap
méthodes. Pourquoi avons-nous deux méthodes pour appliquer une fonction à un DataFrame? Encore une fois, des exemples simples qui illustrent l'utilisation seraient formidables!
python
pandas
dataframe
vectorization
marillion
la source
la source
Réponses:
Directement tiré du livre Python for Data Analysis de Wes McKinney , p. 132 (j'ai fortement recommandé ce livre):
En résumé,
apply
fonctionne sur une base ligne / colonne d'un DataFrame,applymap
fonctionne élément par élément sur un DataFrame etmap
fonctionne élément par élément sur une série.la source
func
delambda x: [func(y) for y in x]
, et l' application par colonne)map
et lesapplymap
deux fonctionnent par élément, je m'attendrais à une seule méthode (soitmap
ouapplymap
) qui fonctionnerait à la fois pour une série et un DataFrame. Il y a probablement d'autres considérations de conception, et Wes McKinney a décidé de proposer deux méthodes différentes.applymap
avec lagroupby
fonction dans les pandas?En comparant
map
,applymap
et : Questions de contexteap
ply
Première différence majeure: DÉFINITION
map
est défini sur la série UNIQUEMENTapplymap
est défini sur DataFrames UNIQUEMENTapply
est défini sur LES DEUXDeuxième différence majeure: ARGUMENT D'ENTRÉE
map
acceptedict
sSeries
, ou appelableapplymap
etapply
accepter les callables uniquementTroisième différence majeure: COMPORTEMENT
map
est élément par élément pour la sérieapplymap
est élément par élément pour les DataFramesapply
fonctionne également par éléments mais convient aux opérations et agrégations plus complexes. Le comportement et la valeur de retour dépendent de la fonction.Quatrième différence majeure (la plus importante): CAS D'UTILISATION
map
est destiné à mapper des valeurs d'un domaine à un autre, il est donc optimisé pour les performances (par exemple,df['A'].map({1:'a', 2:'b', 3:'c'})
)applymap
est bon pour les transformations élément par élément sur plusieurs lignes / colonnes (par exemple,df[['A', 'B', 'C']].applymap(str.strip)
)apply
est pour appliquer une fonction qui ne peut pas être vectorisée (par exemple,df['sentences'].apply(nltk.sent_tokenize)
)Résumer
la source
Il y a d'excellentes informations dans ces réponses, mais j'ajoute les miennes pour résumer clairement les méthodes qui fonctionnent par tableau plutôt que par élément. jeremiahbuddha a principalement fait cela mais n'a pas mentionné Series.apply. Je n'ai pas le représentant pour commenter.
DataFrame.apply
fonctionne sur des lignes ou des colonnes entières à la fois.DataFrame.applymap
,Series.apply
EtSeries.map
opérer sur un élément à la fois.Il y a beaucoup de chevauchement entre les capacités de
Series.apply
etSeries.map
, ce qui signifie que l'un ou l'autre fonctionnera dans la plupart des cas. Ils ont cependant quelques légères différences, dont certaines ont été discutées dans la réponse d'osa.la source
En plus des autres réponses,
Series
il y a aussi une carte et une application .Appliquer peut faire un DataFrame d'une série ; cependant, map ne mettra qu'une série dans chaque cellule d'une autre série, ce qui n'est probablement pas ce que vous voulez.
De plus, si j'avais une fonction avec des effets secondaires, comme «se connecter à un serveur Web», je l'emploierais probablement
apply
juste pour des raisons de clarté.Map
peut utiliser non seulement une fonction, mais aussi un dictionnaire ou une autre série. Disons que vous voulez manipuler les permutations .Prendre
Le carré de cette permutation est
Vous pouvez le calculer en utilisant
map
. Je ne sais pas si l'auto-application est documentée, mais cela fonctionne0.15.1
.la source
@jeremiahbuddha a mentionné que l'application fonctionne sur les lignes / colonnes, tandis que applymap fonctionne par élément. Mais il semble que vous pouvez toujours utiliser Apply pour le calcul par élément ....
la source
Je voulais juste souligner, car j'ai lutté un peu avec ça
cela ne modifie pas la trame de données elle-même, doit être réaffecté
la source
df = modified_df
ou si vous définissez l'inplace=True
indicateur. La trame de données changera également si vous passez une trame de données à une fonction par référence et que la fonction modifie la trame de données.ix
ou.where
etc. Je ne sais pas quelle est l'explication complète pour quand vous devez réaffecter et quand non.Explication probablement la plus simple de la différence entre apply et applymap:
appliquer prend la colonne entière comme paramètre, puis attribue le résultat à cette colonne
applymap prend la valeur de cellule séparée comme paramètre et attribue le résultat à cette cellule.
NB Si appliquer renvoie la valeur unique, vous aurez cette valeur au lieu de la colonne après l'attribution et, finalement, vous n'aurez qu'une ligne au lieu de la matrice.
la source
Ma compréhension:
Du point de vue de la fonction:
Si la fonction a des variables qui doivent être comparées dans une colonne / ligne, utilisez
apply
.par exemple:
lambda x: x.max()-x.mean()
.Si la fonction doit être appliquée à chaque élément:
1> Si une colonne / ligne est localisée, utilisez
apply
2> Si appliquer à l'ensemble de la trame de données, utilisez
applymap
la source
Basé sur la réponse de cs95
map
est défini sur la série UNIQUEMENTapplymap
est défini sur DataFrames UNIQUEMENTapply
est défini sur LES DEUXdonner quelques exemples
la source
FOMO:
L'exemple suivant montre
apply
etapplymap
s'applique à aDataFrame
.map
la fonction est quelque chose que vous appliquez uniquement sur la série. Vous ne pouvez pas postulermap
sur DataFrame.La chose à retenir est que
apply
peut tout faireapplymap
peut, maisapply
a des options eXtra .Les options du facteur X sont:
axis
etresult_type
oùresult_type
ne fonctionne que lorsqueaxis=1
(pour les colonnes).En tant que sidenote, la
map
fonction Series ne doit pas être confondue avec lamap
fonction Python .Le premier est appliqué sur Series, pour mapper les valeurs, et le second à chaque élément d'un itérable.
Enfin, ne confondez pas la
apply
méthode dataframe avec laapply
méthode groupby .la source