如何过滤这个数据框?

How to filter this dataframe?

我有一个大数据框 (sample)。我正在根据以下代码过滤数据:

A = [f"A{i}" for i in range(50)]  
B = [f"B{i}" for i in range(50)]  
C = [f"C{i}" for i in range(50)]

for i in A:
 cond_A = (df[i]>= -0.0423) & (df[i]<=3)  
 filt_df = df[cond_A]
for i in B:
 cond_B = (filt_df[i]>= 15) & (filt_df[i]<=20)  
 filt_df2 = filt_df[cond_B]
for i in C:
 cond_C = (filt_df2[i]>= 15) & (filt_df2[i]<=20)
 filt_df3 = filt_df2[cond_B]
  1. 当我打印 filt_df3 时,我得到的只是一个空数据框 - 为什么?
  2. 如何改进代码,其他方法,如一些高级技术?
  3. 我不确定上面的代码是否按照下面的编辑所述工作?
  4. 我想知道如何更改代码,使其按照下面的编辑所述工作?

编辑:

  1. 我想根据 cond_A.
  2. 删除基于列 (A0 - A49) 的行
  3. 然后使用 cond_B.
  4. 根据列 (B0 - B49) 从 1 开始过滤数据帧
  5. 然后使用 cond_C.
  6. 根据列 (C0 - C49) 从 2 中过滤数据帧

非常感谢您。

由于 A1 列仅包含 [-0.0423, 3] 之外的 -0.057,因此所有内容都被过滤掉了。

然而,您似乎没有在每个循环中接管过滤器,因为 filt_df{1|2|3} 已重置。

这应该有效:

import pandas as pd

A = [f"A{i}" for i in range(50)]  
B = [f"B{i}" for i in range(50)]  
C = [f"C{i}" for i in range(50)]

filt_df = df.copy()
for i in A:
    cond_A = (df[i] >= -0.0423) & (df[i]<=3)  
    filt_df = filt_df[cond_A]
filt_df2 = filt_df.copy()
for i in B:
    cond_B = (filt_df[i]>= 15) & (filt_df[i]<=20)  
    filt_df2 = filt_df2[cond_B]
filt_df3 = filt_df2.copy()
for i in C:
    cond_C = (filt_df2[i]>= 15) & (filt_df2[i]<=20)
    filt_df3 = filt_df3[cond_B]

print(filt_df3)

当然你会在pandas库中找到很多可以应用于多列的过滤工具

例如:

在我看来,当您使用迭代进行过滤时,您的代码存在问题。例如,filt_df 在第一个循环的每次迭代中都被覆盖。当循环结束时,filt_df只包含上次迭代设置的条件过滤后的数据。这是你打算做的吗?

而如果你想做高效的过滤,你可以尝试使用pandas.DataFrame.querysee documentation here)。例如,如果你想过滤掉所有 B0 到 B49 列包含 0 到 200 之间的值的行,你可以尝试使用下面的 Python 代码(假设你已经将原始数据导入变量 df 下面)。

condition_list = [f'B{i} >= 0 & B{i} <= 200' for i in range(50)]
filter_str = ' & '.join(condition_list)
subset_df = df.query(filter_str)
print(subset_df)

您可以按所有列和 DataFrame.all 一起过滤,以测试所有行是否匹配:

A = [f"A{i}" for i in range(50)] 
cond_A = ((df[A] >= -0.0423) & (df[A]<=3)).all(axis=1)
B = [f"B{i}" for i in range(50)] 
cond_B = ((df[B]>= 15) & (df[B]<=20)).all(axis=1)
C = [f"C{i}" for i in range(50)] 
cond_C = ((df[C]>= 15) & (df[C]<=20)).all(axis=1)

最后通过 & 将所有掩码链接为按位 AND:

filt_df = df[cond_A & cond_B & cond_C]

如果得到空的DataFrame,似乎没有行满足所有条件。