【问题标题】:Pandas use multiple conditions for assigning values in a column:Pandas 使用多个条件在列中分配值:
【发布时间】:2019-01-17 00:33:52
【问题描述】:

我有一个包含 3 列的数据框:Roleto_group1to_group2remove,我想分配True,其中to_group1to_group2 中的值是nan,但是看来我的代码不起作用,我做错了什么?

df.remove = np.where(((df.to_group1 == np.nan)) & ((df.to_group2 == 
np.nan)), True, np.nan)

使用此代码,我只能得到 remove 的列满 nan。

这是我的表格的一个例子:

+------+-----------+-----------+--------+
| role | to_group1 | to_group2 | remove |
+------+-----------+-----------+--------+
| foo  | nan       | 1         | nan    |
+------+-----------+-----------+--------+
| foo1 | nan       | nan       | 1      |
+------+-----------+-----------+--------+
| bar  | 1         | nan       | nan    |
+------+-----------+-----------+--------+

此外,我已经用一些值初始化了我的列remove,我不想为整个列重新分配新值,我只想“在两个条件都满足的地方设置一个 true”并且不修改任何内容否则。

【问题讨论】:

  • 你想要df.remove = np.where((pd.isnull(aws.to_group1)) & (pd.isnull(aws.to_group2)), True, np.nan)你不能和NaN直接使用==比较

标签: python pandas numpy dataframe


【解决方案1】:

使用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'

【讨论】:

  • 非常感谢!我终于成功了,非常感谢首先出现的 EdChum!
  • 很高兴您解决了您的问题;} 请注意,您可以按照我的建议使用pd.isnull(series) 或简单地使用series.isnull()。我个人认为后者不那么冗长,但它们做的事情几乎相同
  • 但是如果之前我已经在remove中初始化了一些值,所以我不想更改remove列,而只是更新它呢?
  • 您可以使用布尔掩码。用这个细节更新问题,我可以更新答案;}
【解决方案2】:

这是一个已知的特性: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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多