Pandas,选择一个第二列存在NaN值的单个列。

3

我有一个数据框,长这样:

    a   b   c
0   Alabama[edit]   NaN NaN
1   Auburn  (Auburn University)[1]
2   Florence    (University of
3   Jacksonville    (Jacksonville   State
4   Livingston  (University of

我希望向数据框中添加一列名为“State”的列,当列“b”的值为NaN时,该列将复制列“a”的值,否则它将在state列中放置NaN值。
我尝试过:
df['State'] = np.where(df['b'] == np.NaN, df['a'], np.NaN)
df['State'] = df.loc[df['b'] == np.NaN, 'a']

然而,由于某种原因,这两个方法似乎都不能对np.NaN进行求值。如果我修改标准为== '(Auburn',那么它会找到该行,并将列'a'的值正确地复制到'State'中。
如果我使用这个函数:df1 = df[df['b'].isnull()],那么我会得到所有相关的行,但是在一个新的数据框中,这正是我想避免的。
非常感谢任何帮助。
谢谢, JP
2个回答

4

你的错误在于认为 df['b'] == np.NaN 选择了NaN... 实际上并没有,正如这个例子所示:

In [1]: np.nan == np.nan
Out[1]: False

这是NaN的数学定义。由于NaN!= NaN,对NaN进行相等比较是行不通的。请使用isnaisnullnp.isnan这些函数,它们专门用于此目的。
例如,
df['State'] = np.where(df['b'].isnull(), df['a'], np.NaN)

或者,

df['State'] = df.loc[df['b'].isnull(), 'a']

1

您可以在where语句中使用isnull,因为NaN具有不等于自身的属性。

df.a.where(df['b'].isnull())
Out[112]: 
0    Alabama[edit]
1              NaN
2              NaN
3              NaN
4              NaN
Name: a, dtype: object

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