Pandas,选择单个列,其中第二列具有NaN值

时间:2018-03-17 18:44:13

标签: python pandas numpy dataframe

我有一个如下所示的数据框:

    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'的数据框中添加一列。复制列的值' a'当列' b'具有NaN值,否则它只会在状态列中放置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'然后它会找到该行并正确地将列的值复制到'状态'

如果我使用此功能: df1 = df[df['b'].isnull()]然后我获得所有相关的行,但是在我试图避免的新数据框中。

任何帮助非常感谢。 谢谢 JP

2 个答案:

答案 0 :(得分: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 :(得分:1)

您可以将isnullwhere一起使用,因为NaN具有不相等的属性

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