python - 如果列值在一定范围内彼此接近,则删除 pandas 行

标签 python python-3.x python-2.7 pandas numpy

我想删除所有 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 过滤行:如果 bc 的当前值接近(在 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/

相关文章:

python - 将 pyaudio 安装到 docker 容器

python-2.7 - opencv:在鼠标单击时保存图像

python - 用于测试的 Scrapy 限制请求

python - 为什么我不能为 python 使用已安装的模块?

python - 这里 "if False:"的作用是什么?

来自 yahoo 的 python lxml etree applet 信息

python - 检测应用层协议(protocol),python?

python - 根据另一个数据帧索引中的日期和月份重新排列数据帧中的组

python - 无法播放 IBM Watson 的 TTS(文本转语音)生成的 WAV 文件

Python OSError : [Errno 2]