2017-10-10 11 views
1

Ces deux fonctions me semblent équivalentes. Vous pouvez voir qu'ils accomplissent le même but dans le code ci-dessous, car les colonnes c et d sont égales. Alors quand devrais-je utiliser l'un sur l'autre?Quelle est la différence entre combine_first et fillna?

Voici un exemple:

import pandas as pd 
import numpy as np 

df = pd.DataFrame(np.random.randint(0, 10, size=(10, 2)), columns=list('ab')) 
df.loc[::2, 'a'] = np.nan 

Retours:

 a b 
0 NaN 4 
1 2.0 6 
2 NaN 8 
3 0.0 4 
4 NaN 4 
5 0.0 8 
6 NaN 7 
7 2.0 2 
8 NaN 9 
9 7.0 2 

Ceci est mon point de départ. Maintenant, je vais ajouter deux colonnes, l'une à l'aide combine_first et un utilisant fillna, et ils produiront le même résultat:

df['c'] = df.a.combine_first(df.b) 
df['d'] = df['a'].fillna(df['b']) 

Retours:

 a b c d 
0 NaN 4 4.0 4.0 
1 8.0 7 8.0 8.0 
2 NaN 2 2.0 2.0 
3 3.0 0 3.0 3.0 
4 NaN 0 0.0 0.0 
5 2.0 4 2.0 2.0 
6 NaN 0 0.0 0.0 
7 2.0 6 2.0 2.0 
8 NaN 4 4.0 4.0 
9 4.0 6 4.0 4.0 

crédit à cette question pour l'ensemble de données: Combine Pandas data frame column values into new column

+1

Je ne suis pas très familier avec les pandas, mais il semble que vous ayez plus de contrôle avec [fillna] (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.fillna.html) alors que [combine_first] (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.combine_first.html) est une affaire unique – Wondercricket

Répondre

5

combine_first est destiné à être utilisé lorsqu'il existe des indices qui ne se chevauchent pas. Il remplira efficacement les valeurs nulles ainsi que les valeurs d'offre pour les index et les colonnes qui n'existaient pas dans le premier.

dfa = pd.DataFrame([[1, 2, 3], [4, np.nan, 5]], ['a', 'b'], ['w', 'x', 'y']) 
dfb = pd.DataFrame([[1, 2, 3], [3, 4, 5]], ['b', 'c'], ['x', 'y', 'z']) 

dfa.combine_first(dfb) 

    w x y z 
a 1.0 2.0 3.0 NaN 
b 4.0 1.0 5.0 3.0 # 1.0 filled from `dfb`; 5.0 was in `dfa`; 3.0 new column 
c NaN 3.0 4.0 5.0 # whole new index 

Notez que tous les indices et les colonnes sont inclus dans les résultats

Maintenant, si nous fillna

dfa.fillna(dfb) 

    w x y 
a 1 2.0 3 
b 4 1.0 5 # 1.0 filled in from `dfb` 

Avis pas de nouvelles colonnes ou indices de dfb sont inclus. Nous avons seulement rempli la valeur nulle où dfa partagé l'information d'index et de colonne.


Dans votre cas, vous utilisez fillna et combine_first sur une colonne avec le même index. Ceux-ci traduisent effectivement la même chose.