如果数据框的A列中的值为null,则将列B中的值写入A列

时间:2017-06-23 16:12:15

标签: python pandas

我无法理解这一点。我有一个包含以下值的数据框:

df = pd.DataFrame([
    (1,np.nan,"a"),
    (1,"a",np.nan),
    (1,np.nan,"b"),
    (1,"c","b"),
    (2,"a",np.nan),
    (2,np.nan,"b"),
    (3,"a",np.nan)], columns=["A", "B", "C"])

转化为

   A    B    C
0  1    NaN  a
1  1    a    NaN
2  1    NaN  b
3  1    c    b
4  2    a    NaN
5  2    NaN  b
6  3    a    NaN

我想要的是,如果我在“B”中有空值/空字段,则应该用“C”中的值替换它。像这样:

   A    B    C
0  1    a    a
1  1    a    NaN
2  1    b    b
3  1    c    b
4  2    a    NaN
5  2    b    b
6  3    a    NaN

我当然可以为值输入:

df.loc[df.B.isnull()]

但我无法设法从另一列分配值:

df.loc[df.B.isnull()] = df.C

据我所知,我想用C列中的七个条目替换三个NaN,因此它不匹配。那么如何获得相应的值?

2 个答案:

答案 0 :(得分:1)

您可以使用:

df.loc[df.B.isnull(), 'B'] = df.C

输出:

   A  B    C
0  1  a    a
1  1  a  NaN
2  1  b    b
3  1  c    b
4  2  a  NaN
5  2  b    b
6  3  a  NaN

或者如下面评论中的建议,您也可以使用:

df.B.where(pd.notnull, df.C, inplace=True)

答案 1 :(得分:1)

你可以使用combine_first,它似乎也快得多

df.B = df.B.combine_first(df.C)
1000 loops, best of 3: 764 µs per loop

df.loc[df.B.isnull(), 'B'] = df.C
100 loops, best of 3: 1.54 ms per loop

你得到了

    A   B   C
0   1   a   a
1   1   a   NaN
2   1   b   b
3   1   c   b
4   2   a   NaN
5   2   b   b
6   3   a   NaN