【问题标题】:Dataframe not filtering correctly when choosing a specific value (Pandas)选择特定值时数据框未正确过滤(熊猫)
【发布时间】:2020-12-31 13:54:04
【问题描述】:

我的df 看起来像这样:

URN col1 col2 col3 TEMPPNUM
100279 24.0 75.8 0.1 99.9
100055 52.2 47.8 0.0 100.0
107782 12.3 86.2 1.5 100.0
112956 12.3 86.2 1.5 100.0
139957 19.9 79.9 0.2 100.0

TEMPPNUM 列是这样创建的:

df['TEMPPNUM'] = ((df['col1'] + df['col2'] + df['col3']))

我想过滤掉所有 TEMPPNUM 列不等于 100 的行。

df = df.loc[(df['TEMPPNUM'] == 100)]

但是,当我这样做时,过滤掉的值比我预期的要多。有什么原因吗? (我的数据框比示例大得多)。

它会过滤掉所有不等于 100 的值,但也会过滤掉很多 TEMPPNUM 确实等于 100 的行。

【问题讨论】:

  • 您能否向我们展示一个工作示例,其中 rows = 100 也已被过滤?一个原因可能是,100 的一些值可能是 object 和少数 int/float。所以str 值被过滤掉了。
  • @MayankPorwal 有一个观点。如果您的数据不一致,您可能会使用该方法得到这些意想不到的结果。比较时尝试使用astype - df['TEMPPNUM'].astype(int) == 100
  • 这是我的想法之一,但我仍然发现没有删除的单元格,我也尝试了您建议的方法,但仍然无济于事。我仍然可以看到 ['TEMPPNUM'] 等于 100 的多行被过滤掉。我使用了 df['TEMPPNUM'] = pd.to_numeric(df['TEMPPNUM']) 来确保该行使用正确的类型
  • 我认为我们需要一些来自失败的样本数据。显示一些样本,其中 100 显示如下:df.head(5), df.info() 其中 DF 表示“过滤”表。希望这是有道理的
  • pasteboard.co/JHtSr0S.png 我已经截取了我所看到的内容。您可以立即看到 URN: 100049 已在不应该被删除时被删除

标签: python pandas dataframe filter


【解决方案1】:

一种方法

>>> df.query('TEMPPNUM != 100')

另一种方法是使用“掩码”

>>> df[df.TEMPPNUM!=100]

两者都应该产生这个输出

      URN  col1  col2  col3  TEMPPNUM
0  100279  24.0  75.8   0.1      99.9

编辑:

如果您的 TEMPPNUM 不是 float/int,那么您可以将其转换为此类或直接执行此操作

>>> df.query('TEMPPNUM != 100')

      URN  col1  col2  col3 TEMPPNUM
0  100279  24.0  75.8   0.1     99.9
5  123321  91.0  99.0   0.5      100

>>> mask=df['TEMPPNUM'].astype(int) == 100

>>> df[~mask]

      URN  col1  col2  col3 TEMPPNUM
0  100279  24.0  75.8   0.1     99.9

【讨论】:

  • 我不认为这是他想要的。
【解决方案2】:

问题在于浮点比较,不限于 Pandas DataFrame。这是 Python(可能还有其他语言)中的一个普遍问题,很难直接比较它们。 这解释了为什么使用整数时问题更少。

您在屏幕上看到的精度(“100.0”)不是它的存储方式,而是更细粒度的。由于舍入和精度,显然并不总是相同。

例如/解决方案参见Comparing floats in a pandas column等相关问题

解决方案通常是比较它们是否在彼此之间的一小段距离内,而不是实际上相等,例如通过 numpy:

>>> import numpy as np    
>>> np.isclose(df['TEMPNUM'], 100.0)
    array([False,  True,  True,  True,  True])
>>> df[np.isclose(df['TEMPNUM'], 100.0)]
      URN  col1  col2  col3  TEMPNUM
1  100055  52.2  47.8   0.0    100.0
2  107782  12.3  86.2   1.5    100.0
3  112956  12.3  86.2   1.5    100.0
4  139957  19.9  79.9   0.2    100.0

【讨论】:

    猜你喜欢
    • 2018-05-20
    • 1970-01-01
    • 2019-08-09
    • 2022-01-21
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    相关资源
    最近更新 更多