【发布时间】:2019-01-23 07:19:54
【问题描述】:
我想删除在某个预定义范围内两列中的值彼此接近的所有 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 列中迭代地应用此条件并将此条件应用于两个不同的列?
旁注: 我的熊猫数据框中有两百万行。因此,我想知道最有效的方法。
【问题讨论】:
-
b 列和 c 列中的下一个元素应在同一列中前一个值的 99% 以内。即(19.96 应该在 20.02 的 99% 范围内,&& 9.89 应该是 10.12 的 99%)。之后,对第 3 行和第 1 行重复此操作。 (因为第二行被删除了)
-
很抱歉 column_b 和 column_c 变量令人困惑。我的意思是同一列中的下一个值应该与同一列中的前一个值接近 99%。
-
b 列和 c 列都应在其先前值的 99% 以内,这就是不包括第 4 行的原因。
-
是的,这就是为什么删除第 4 行的原因与第 2 行完全相同。我正在尝试过滤掉值彼此接近的行。
-
该死的,我真是太愚蠢了。这是我的错误。 9.89 只是一个虚构的数字,它应该类似于 10.10。我想过滤 both 列 b 和 c 非常接近其先前值的值。
标签: python python-3.x python-2.7 pandas numpy