熊猫在列中使用多种条件分配值:

时间:2018-08-09 13:48:18

标签: python pandas numpy dataframe

我有一个包含3列的数据框:Roleto_group1to_group2remove,我想分配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 | +------+-----------+-----------+--------+ ,并且我不想为整个列重新分配新值,我只是想“在两个条件都满足的情况下输入真”修改其他内容。

2 个答案:

答案 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.isnullall结合使用:

df['remove'] = np.where(df[['to_group1', 'to_group2']].isnull().all(1), True, np.nan)