小能豆

pandas没有按行条件正确过滤

python

我有一个带有 ID、日期和 DIM 的 df。DIM 是 int64

当我做:

df2=df.loc[df.DIM>50]

df 中有 DIM>50 的行不属于 df2。

有谁知道为什么?

如果我执行 df3=df.loc[df.ID==6],它会返回 ID 为 DIM>57 且不属于上述 df2 的行。然后,如果我这样做: df4=df3.loc[df3.DIM>50] 它起作用了……现在,最初在 df2 中排除且 DIM>50 的行现在在 df3 中。


阅读 132

收藏
2023-06-13

共1个答案

小能豆

根据您描述的情况,问题可能是由于数据筛选和索引的顺序导致的。

在您执行 df2=df.loc[df.DIM>50] 时,它会返回 DIM 列中值大于 50 的行。然而,您可能没有考虑到筛选后的结果 DataFrame 的索引可能与原始 DataFrame 的索引不同。

因此,当您执行 df3=df.loc[df.ID==6] 时,它返回了 ID 列等于 6 的行,但此时索引已经改变,与原始 DataFrame 的索引可能不同。因此,通过执行 df3.loc[df3.DIM>50],它会在筛选后的结果中找到 DIM 列大于 50 的行,但这些行实际上可能是与最初的 df 不同的行。

要解决这个问题,您可以使用 .reset_index(drop=True) 方法来重置筛选结果 DataFrame 的索引并丢弃原始索引。这样可以确保筛选结果与原始 DataFrame 相对应。以下是修正的代码示例:

df2 = df.loc[df.DIM > 50].reset_index(drop=True)
df3 = df.loc[df.ID == 6].reset_index(drop=True)
df4 = df3.loc[df3.DIM > 50].reset_index(drop=True)

通过在筛选后的 DataFrame 上使用 reset_index(drop=True),您可以重置索引并创建一个新的连续的整数索引,确保筛选结果正确对应。

请注意,根据您的数据结构和要求,具体的代码可能需要进行适当的调整。

2023-06-13