我有一个如下所示的数据框:
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
答案 0 :(得分:4)
您的错误在于您认为df['b'] == np.NaN
选择了NaN ...但它没有,正如此示例所示:
In [1]: np.nan == np.nan
Out[1]: False
这是NaN的数学定义。由于NaN!= NaN,在NaN上进行相等比较只是不会削减它。使用isna
或isnull
或np.isnan
,这些功能就是出于此目的。
例如,
df['State'] = np.where(df['b'].isnull(), df['a'], np.NaN)
或者,
df['State'] = df.loc[df['b'].isnull(), 'a']
答案 1 :(得分:1)
您可以将isnull
与where
一起使用,因为NaN具有不相等的属性
df.a.where(df['b'].isnull())
Out[112]:
0 Alabama[edit]
1 NaN
2 NaN
3 NaN
4 NaN
Name: a, dtype: object