如何过滤这个数据框?
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]
- 当我打印
filt_df3
时,我得到的只是一个空数据框 - 为什么?
- 如何改进代码,其他方法,如一些高级技术?
- 我不确定上面的代码是否按照下面的编辑所述工作?
- 我想知道如何更改代码,使其按照下面的编辑所述工作?
编辑:
- 我想根据
cond_A
. 删除基于列 (A0 - A49) 的行
- 然后使用
cond_B
. 根据列 (B0 - B49) 从 1 开始过滤数据帧
- 然后使用
cond_C
. 根据列 (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.query
(see 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,似乎没有行满足所有条件。
我有一个大数据框 (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]
- 当我打印
filt_df3
时,我得到的只是一个空数据框 - 为什么? - 如何改进代码,其他方法,如一些高级技术?
- 我不确定上面的代码是否按照下面的编辑所述工作?
- 我想知道如何更改代码,使其按照下面的编辑所述工作?
编辑:
- 我想根据
cond_A
. 删除基于列 (A0 - A49) 的行
- 然后使用
cond_B
. 根据列 (B0 - B49) 从 1 开始过滤数据帧
- 然后使用
cond_C
. 根据列 (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.query
(see 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,似乎没有行满足所有条件。