2
votes

Pandas fillna () ne fonctionne pas sur les tranches DataFrame

Pandas fillna ne fonctionne pas sur les tranches DataFrame, voici un exemple

df.fillna(0, inplace=True)

le DataFrame ne change pas p >

df["A"].fillna(0, inplace=True)

en revanche

    A   B   C   D
0   NaN 2.0 NaN 0
1   3.0 4.0 NaN 1
2   NaN NaN NaN 5
3   NaN 3.0 NaN 4

et

df = pd.DataFrame([[np.nan, 2, np.nan, 0],
                [3, 4, np.nan, 1],
                [np.nan, np.nan, np.nan, 5],
                [np.nan, 3, np.nan, 4]],
                columns=list('ABCD'))
df[["A", 'B']].fillna(0, inplace=True)

fonctionnent bien.

Est-ce un bug ou fonctionne-t-il comme prévu? Merci d'avance.

P.S. cette question demande comment faire utilisez fillna sur une tranche, quant à ma question, elle concerne pourquoi ce qui précède ne fonctionne pas. La réponse se trouve dans la section des commentaires @ heena-bawa answers.


0 commentaires

3 Réponses :


3
votes

Si nous regardons le documentation pandas il dit que vous devez utiliser ce qui suit pour fillna sur les tranches:

values = {'A':0, 'B':0}
df.fillna(value=values, inplace=True)

print(df)

     A    B   C  D
0  0.0  2.0 NaN  0
1  3.0  4.0 NaN  1
2  0.0  0.0 NaN  5
3  0.0  3.0 NaN  4


1 commentaires

merci d'avoir répondu, mais je pense que donner un dict / Series ou DF est pour "spécifier la valeur à utiliser pour chaque index" et df [["A" , 'B']] est un DataFrame parfaitement parfait. Votre méthode est une bonne solution de contournement, mais encore une fois ma question était "Est-ce un bogue ou fonctionne-t-il comme prévu?".



2
votes

Vous pouvez utiliser:

df[['A','B']] = df[['A','B']].fillna(0)

     A    B   C  D
0  0.0  2.0 NaN  0
1  3.0  4.0 NaN  1
2  0.0  0.0 NaN  5
3  0.0  3.0 NaN  4


3 commentaires

Le but de inplace = True n'est-il pas d'éviter l'utilisation de l'opérateur d'affectation?


inplace = True pour une tranche d'un dataframe ne fonctionnera pas. Il fonctionne sur une base de données complète. Vous devez uniquement mettre à jour la tranche.


Pour plus d'informations, vous pouvez consulter: pandas.pydata.org/pandas- docs / stable / user_guide / indexing.htm‌ l



0
votes

Je pense que cela fonctionne comme prévu. Si j'essaie votre code, cela lance un avertissement:

SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  downcast=downcast, **kwargs)

Signification: En sélectionnant les colonnes de cette manière, vous générez une copie et donc le paramètre en place ne peut pas avoir d'effet. p>


0 commentaires