【问题标题】:Pandas vs. PEP8: Selecting True values in a Series with mixed typesPandas 与 PEP8:在具有混合类型的系列中选择真值
【发布时间】:2019-09-04 15:16:12
【问题描述】:

我有一个名为dfDataFrame,其中有一列col,其中包含值TrueFalse"N/A"(类型分别为boolboolstr)。我只想选择包含True 的行。

df[df.col==True] 有效,但会生成警告 PEP 8: comparison to True should be 'if cond is True:' or 'if cond:'

是否有符合 PEP8 的方法来执行此操作?

【问题讨论】:

  • 你的熊猫版本是什么?因为在 pandas 0.24.2 中没有错误
  • df = pd.DataFrame({'col':[True, False, 'N/A']})测试
  • is 没有被 Pandas 重载,因此在这种情况下它不是一个选项......
  • 在这种情况下,如果你需要一个重载的__eq__,是的,你有时可以反对 PEP8。了解如何在您的 lint 工具中禁用此特定警告(# noqa 通常可以解决问题)。

标签: python pandas pep8


【解决方案1】:

之前有人问过类似的问题,例如pandas: Do I have to deviate from style conventions (PEP 8)?,但它们都描述了一个简单的情况,即您的列只有TrueFalse 值。在这种情况下,您可以只使用df[df.col]

在你的情况下,虽然你不能这样做,因为它会给出一个错误,但你有一些其他的选择:

  1. 使用pd.Series.eq

    >>> df = pd.DataFrame({'col': [True, False, 'N/A']})
    >>> df[df.col.eq(True)]
        col
    0  True
    
  2. 首先检查"N/A",然后将剩下的内容与True 进行比较。订单很重要:

    >>> df[(df.col != 'N/A') & df.col]
        col
    0  True
    
  3. "N/A" 替换为np.nan 并使用pd.Series.notnullpd.Series.notna

    >>> df = df.replace('N/A', np.nan)
    >>> df[df.col.notnull() & df.col]
        col
    0  True
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 2018-05-12
    • 2021-01-07
    • 2020-08-06
    • 2018-09-09
    • 1970-01-01
    相关资源
    最近更新 更多