Les Pandas ne fillna() à la place
Je suis en train de remplir le NAs avec "" sur 4 colonnes spécifiques dans un bloc de données qui sont de la chaîne/types d'objet. Je peux attribuer ces colonnes à une nouvelle variable que je fillna(), mais quand je fillna() place les données sous-jacentes ne change pas.
a_n6 = a_n6[["PROV LAST", "PROV FIRST", "PROV MID", "SPEC NM"]].fillna("")
a_n6
me donne:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1542 entries, 0 to 3611
Data columns (total 4 columns):
PROV LAST 1542 non-null values
PROV FIRST 1542 non-null values
PROV MID 1542 non-null values
SPEC NM 1542 non-null values
dtypes: object(4)
mais
a_n6[["PROV LAST", "PROV FIRST", "PROV MID", "SPEC NM"]].fillna("", inplace=True)
a_n6
me donne:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1542 entries, 0 to 3611
Data columns (total 7 columns):
NPI 1103 non-null values
PIN 1542 non-null values
PROV FIRST 1541 non-null values
PROV LAST 1542 non-null values
PROV MID 1316 non-null values
SPEC NM 1541 non-null values
flag 439 non-null values
dtypes: float64(2), int64(1), object(4)
C'est seulement une ligne, mais toujours frustrant. Ce que je fais mal?
J'ai aussi rencontré quelques fonctions où
inplace=True
semble être ignoré. Alors que ce n'est pas le problème dans votre cas, il est bon de garder à l'esprit lors de la résolution.OriginalL'auteur Beau Bristow | 2014-02-24
Vous devez vous connecter pour publier un commentaire.
Utiliser un
dict
comme levalue
argumentfillna()
Comme mentionné dans le commentaire de @rhkarls sur @Jeff réponse, à l'aide de
.loc
indexées à une liste de colonnes ne prend pas en chargeinplace
opérations, que moi aussi j'ai trouver frustrant. Voici une solution de contournement.Exemple:
Disons que nous voulons
fillna
pourx
ety
seulement, pasa
etb
.Je m'attends à l'aide de
.loc
de travail (comme dans une cession), mais il n'a pas, comme mentionné plus tôt:Cependant, la la documentation dit que le
value
argumentfillna()
peut être:Il s'avère que l'utilisation d'un dict des valeurs de travail:
Aussi, si vous avez un grand nombre de colonnes dans votre sous-ensemble, vous pouvez utiliser un dict compréhension, comme dans:
OriginalL'auteur C8H10N4O2
vous de les remplir d'une copie (que vous ne pouvez pas voir)
:
fillna
en place (il n'y a pas de gain de performances de faire quelque chose en place)a_n6[[list_of_fileds]]
est une copie dans un multi-dtype objet), voir ici: http://pandas.pydata.org/pandas-docs/stable/indexing.html#returning-a-view-versus-a-copyvoici une explication plus approfondie
Pandas: Enchaîné les affectations
inplace
arg si elle ne change pas le comportement de la fonction?Alors, pourquoi est-inplace même permis de fillna()?
En place ne fonctionne pas si vous utilisez .loc. En place ne devraient pas travailler si vous travaillez sur une copie. Voir les liens que Jeff inclus. Il ne fonctionnera pas pour une liste de champs (par exemple, df.loc[:,[liste de champs]]), mais il faudra travailler sur une tranche ou d'un champ unique. Voir aussi github.com/pandas-dev/pandas/issues/11984 pour plus de détails sur cette.
J'ai juste couru fillna sur un 20 go dataset, avec les place et les ai pas mis en place d'erreur. Je ne vois pas de coup de gueule à propos de "pas de gain de performance'. Je n'ai pas un autre de 20 go de mémoire pour avoir un temp de copie. Place serait très bénéfique.
OriginalL'auteur Jeff