【问题标题】:Pandas boolean mask contains NaNs. How to filter?Pandas 布尔掩码包含 NaN。如何过滤?
【发布时间】:2019-06-05 22:00:27
【问题描述】:

我在下面有这个熊猫数据框:

    Id                          Guild                                     Test
0   5c5dc770f920209b94c3def3    72f92390/7f2e/4b41/b53b/393470619eca      True
1   5c5dc7707d62f8b356457863    596f57d7/c8a9/4b14/aec1/18ef2b9fa940      None
2   5c5dc770974d1a6d38cffa3a    6a7ad94c/0511/4ef9/8b60/e05158cad03c     False
3   5c5dc7709809c3452ae07d22    843d9c5f/1f53/4752/a905/0b1de73efab2      None
4   5c5dc7706c606a2118c4350b    9d63dcc5/1063/49b3/9a90/a854e7eb7398      None

当我尝试应用 numpy.where 时:

pdf['Id'] = np.where(bool(pdf['Test']), pdf['Id'], None)

还尝试使用 numpy.equal:

pdf['Id'] = np.where(np.equal(pdf['Test'], None), None, pdf['Id'])

向我抛出错误:

ValueError:Series 的真值不明确。使用a.empty, a.bool()、a.item()、a.any() 或 a.all()。

我的目标:将 None 应用于 Teste 不是有效布尔值的 Id 列。

我检查了这些类似的问题: link OneLink Two

提前致谢。

【问题讨论】:

  • bool 是一个返回单个布尔值的 Python 函数。 Test 列是一个系列,有多个值。该歧义错误是 Pandas 中 numpybool(np.array([True, False, True])) 产生的错误的等价物 - 试图从几个数组中获取布尔值。

标签: python pandas dataframe nan


【解决方案1】:

这里的复杂之处在于您的“布尔”列也有 None 值。

您可以改为将“测试”列与True 进行比较。

pdf['Id'] = np.where(pdf['Test'] == True, pdf['Id'], None)
pdf    
                         Id                                 Guild   Test
0  5c5dc770f920209b94c3def3  72f92390/7f2e/4b41/b53b/393470619eca   True
1                      None  596f57d7/c8a9/4b14/aec1/18ef2b9fa940   None
2                      None  6a7ad94c/0511/4ef9/8b60/e05158cad03c  False
3                      None  843d9c5f/1f53/4752/a905/0b1de73efab2   None
4                      None  9d63dcc5/1063/49b3/9a90/a854e7eb7398   None

或者,使用loc 分配。

pdf.loc[pdf['Test'] != True, 'Id'] = None
pdf    
                         Id                                 Guild   Test
0  5c5dc770f920209b94c3def3  72f92390/7f2e/4b41/b53b/393470619eca   True
1                      None  596f57d7/c8a9/4b14/aec1/18ef2b9fa940   None
2                      None  6a7ad94c/0511/4ef9/8b60/e05158cad03c  False
3                      None  843d9c5f/1f53/4752/a905/0b1de73efab2   None
4                      None  9d63dcc5/1063/49b3/9a90/a854e7eb7398   None

【讨论】:

  • 谢谢@coldspeed,我猜你只要这样做就可以了:x = None bool(x) 它返回 False,但在这种情况下,我们比较的是一个简单的变量。我想它不适用于熊猫,因为我们使用的是pandas.Series,根据这个答案:link 但是,这个解决方案对我有用。谢谢!
猜你喜欢
  • 2019-12-07
  • 1970-01-01
  • 2017-03-16
  • 2016-12-12
  • 2022-08-19
  • 2013-05-17
  • 2018-04-10
  • 2021-11-16
  • 1970-01-01
相关资源
最近更新 更多