我有一个包含3列的数据框:Role
,to_group1
,to_group2
,remove
,我想分配True
,其中{中的值{1}}和to_group1
是nan,但是似乎我的代码无法正常工作,我在做什么错?
to_group2
使用此代码,我只会得到df.remove = np.where(((df.to_group1 == np.nan)) & ((df.to_group2 ==
np.nan)), True, np.nan)
充满nan的列。
这是我的桌子的一个例子:
remove
此外,我已经用一些值初始化了列+------+-----------+-----------+--------+
| role | to_group1 | to_group2 | remove |
+------+-----------+-----------+--------+
| foo | nan | 1 | nan |
+------+-----------+-----------+--------+
| foo1 | nan | nan | 1 |
+------+-----------+-----------+--------+
| bar | 1 | nan | nan |
+------+-----------+-----------+--------+
,并且我不想为整个列重新分配新值,我只是想“在两个条件都满足的情况下输入真”修改其他内容。
答案 0 :(得分:2)
使用isnull()
代替== np.nan
df['remove'] = np.where(df.to_group1.isnull() & df.to_group2 .isnull(), True, np.nan)
0 NaN
1 1
2 NaN
假设已编辑
df = pd.DataFrame({'col1': [1, np.nan, 2, 3], 'col2': [np.nan, np.nan, 3, 4]})
df['remove'] = 'some_initia_val'
col1 col2 remove
0 1.0 NaN 'some_initia_val'
1 NaN NaN 'some_initia_val'
2 2.0 3.0 'some_initia_val'
3 3.0 4.0 'some_initia_val'
使用布尔蒙版
df.loc[df.col1.isnull() & df.col2.isnull(), 'remove'] = True
仅在条件满足的情况下更改一个值
col1 col2 remove
0 1.0 NaN 'some_initia_val'
1 NaN NaN True
2 2.0 3.0 'some_initia_val'
3 3.0 4.0 'some_initia_val'
答案 1 :(得分:0)
这是已知的特质:np.nan == np.nan
的值为False
。如上所述,您可以通过pd.Series.isnull
来解决这个问题。
或者,您可以将pd.DataFrame.isnull
与all
结合使用:
df['remove'] = np.where(df[['to_group1', 'to_group2']].isnull().all(1), True, np.nan)