combine_first和fillna有什么区别?

16

这两个函数在我看来是等效的。你可以在下面的代码中看到,它们实现了相同的目标,因为列 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

此问题的数据集归功于:将Pandas数据帧列值组合成新列


1
我对pandas不是很熟悉,但似乎使用fillna可以获得更多的控制权,而combine_first则是一次性的处理。 - Wondercricket
1个回答

34

combine_first被设计用于处理没有重叠索引的情况。它会有效地填充空值,并提供第一个DataFrame中不存在的索引和列的值。

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

dfa.fillna(dfb)

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

注意到从 dfb 中没有包含新的列或索引。我们只是填充了空值,这些空值出现在 dfa 具有共享索引和列信息的位置。


在您的情况下,您在具有相同索引的一个列上使用了 fillnacombine_first。它们实际上是一样的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接