我想删除所有 pandas 行,其中两列中的值在某个预定义范围内彼此接近。
例如:
df = pd.DataFrame({'a':[1,2,3,4,5,6], \
'b':[20.02,19.96,19.98,20.10,26.75,56.12],\
'c':[10.12,10.10,123.54,124.12,245.12,895.21]})
a b c
1 20.02 10.12
2 19.96 10.10
3 19.98 123.54
4 20.10 124.12
5 26.75 245.12
6 56.12 895.21
根据列 b 和 c 过滤行:如果 b
和 c
的当前值接近(在 1% 以内)先前接受的行的值:
(0.99*previous_b < b < 1.01*previous_b) && (0.99*previous_c < c < 1.01*previous_c)
然后他们被排除在外。
结果
a b c
1 20.02 10.12
3 19.98 123.54
5 26.75 245.12
6 56.12 895.21
我可以对一个数字使用 numpy.isclose:
df['b'].apply(np.isclose, b=20.02, atol=0.01 * 20.02)
我如何概括这一点,以便在所有 pandas 列中迭代运行此条件并将此条件应用于两个不同的列?
旁注: 我的 Pandas 数据框中有两百万行。因此,我想知道最有效的方法。
最佳答案
考虑到被比较的行可能会根据每次比较的结果而改变,我不确定你是否可以在不使用一些相当于 for 循环的逻辑的情况下实现这一点:
#Taking initial comparison values from first row
b,c = df.iloc[0][['b','c']]
#Including first row in result
filters = [True]
#Skipping first row in comparisons
for index, row in df.iloc[1:].iterrows():
if 0.99*b <= row['b'] <= 1.01*b and 0.99*c <= row['c'] <= 1.01*c:
filters.append(False)
else:
filters.append(True)
# Updating values to compare based on latest accepted row
b = row['b']
c = row['c']
df2 = df.loc[filters]
print(df2)
a b c
0 1 20.02 10.12
2 3 19.98 123.54
4 5 26.75 245.12
5 6 56.12 895.21
检查 row(n+1) 接近 row(n)(并排除),但 row(n+2) 接近 row(n+1) 但不接近 row(n) 的边缘情况)(因此应该包括在内):
df = pd.DataFrame({'a':[1,2,3], \
'b':[20,20,20],\
'c':[100,100.9,101.1]})
a b c
0 1 20 100.0
2 3 20 101.1
关于python - 如果列值在一定范围内彼此接近,则删除 pandas 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51875213/