这两个功能对我来说似乎等效。您可以在下面的代码中看到它们实现了相同的目标,因为列c和d相等。那么我什么时候应该使用另一个呢?
这是一个例子:
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
返回值:
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
这是我的出发点。现在,我将添加两列,一列使用Combine_first,一列使用fillna,它们将产生相同的结果:
df['c'] = df.a.combine_first(df.b) df['d'] = df['a'].fillna(df['b'])
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
combine_first旨在在存在不重叠索引的情况下使用。它将有效地填充空值以及第一个不存在的索引和列的提供值。
combine_first
dfa = pd.DataFrame([[1, 2, 3], [4, np.nan, 5]], ['a', 'b'], ['w', 'x', 'y']) w x y a 1.0 2.0 3.0 b 4.0 NaN 5.0 dfb = pd.DataFrame([[1, 2, 3], [3, 4, 5]], ['b', 'c'], ['x', 'y', 'z']) x y z b 1.0 2.0 3.0 c 3.0 4.0 5.0 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
请注意,所有索引和列都包含在结果中
现在,如果我们 fillna
fillna
dfa.fillna(dfb) w x y a 1 2.0 3 b 4 1.0 5 # 1.0 filled in from `dfb`
请注意,不包括新的列或索引dfb。我们只在dfa共享索引和列信息的空值中填写。
dfb
dfa
在您的情况下,您可以在具有相同索引的一列上使用fillna和combine_first。这些实际上转化为同一件事。