gpt4 book ai didi

python-3.x - 如何在数据帧的列上循环和测试多个 "numpy.isclose"值?

转载 作者:行者123 更新时间:2023-12-03 20:29:29 26 4
gpt4 key购买 nike

我正在使用这行代码来确定大型数据框 df 列中的值,这些值接近 A 的值(在容差范围内):

df[df[['column']].apply(numpy.isclose, b=A, atol=0.004).any(1)]

但是,在某些情况下,A 可以有多个值(即 2-4 个不同的值)。有没有一种方法可以让我遍历 A 的每个值来测试每个值?我知道上面显示的代码行只会让我使用 A,如果它有一个分配给它的值。

这方面的一个例子是(使用更短的数据帧):
   column1   column2
0 0.902062 5.8
1 0.557808 3.3
2 0.655985 3.9
3 0.832471 4.1
4 0.199884 1.2
5 0.127254 1.8
6 0.771439 4.9
7 0.432289 2.8
8 0.385282 2.2
9 0.783643 3.7

其中 A 具有值:
A=[0.432, 0.783, 0.902]

但在另一个示例中,它可能具有以下值:
A=[0.558, 0.002]

(这里很明显,数据框中的任何内容实际上都不会匹配 0.002)。

我想要一些代码,它能够从数据框中返回行,其中 column1 值与所有示例的 A 值匹配,而不管不同 A 值的数量如何(如果没有匹配,则返回“NaN”反而)。

最佳答案

我相信您需要通过 numpy.broadcast_to 来重复列值使用前 numpy.isclose :

np.random.seed(142)

df = pd.DataFrame({'column':np.random.rand(10)})
print (df)
column
0 0.902062
1 0.557808
2 0.655985
3 0.832471
4 0.199884
5 0.127254
6 0.771439
7 0.432289
8 0.385282
9 0.783643
A = [0.432, 0.783, 0.902]

#repeat by length of number of list A
len_A = len(A)
a = np.broadcast_to(df['column'].values[:, None], (len(df),len_A))
print (a)
[[0.90206152 0.90206152 0.90206152]
[0.55780754 0.55780754 0.55780754]
[0.65598471 0.65598471 0.65598471]
[0.83247141 0.83247141 0.83247141]
[0.19988419 0.19988419 0.19988419]
[0.12725426 0.12725426 0.12725426]
[0.77143911 0.77143911 0.77143911]
[0.43228855 0.43228855 0.43228855]
[0.38528223 0.38528223 0.38528223]
[0.78364337 0.78364337 0.78364337]]

#pandas solution
m = pd.concat([df['column']] * len_A, axis=1)
print (m)
column column column
0 0.902062 0.902062 0.902062
1 0.557808 0.557808 0.557808
2 0.655985 0.655985 0.655985
3 0.832471 0.832471 0.832471
4 0.199884 0.199884 0.199884
5 0.127254 0.127254 0.127254
6 0.771439 0.771439 0.771439
7 0.432289 0.432289 0.432289
8 0.385282 0.385282 0.385282
9 0.783643 0.783643 0.783643
m = np.isclose(a, b=A, atol=0.004)
print (m)
[[False False True]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[ True False False]
[False False False]
[False True False]]

最后获取所有值 True每行由 any :
print (m.any(axis=1))
[ True False False False False False False True False True]

最后过滤器 boolean indexing :
print (df[m.any(axis=1)])
column
0 0.902062
7 0.432289
9 0.783643

关于python-3.x - 如何在数据帧的列上循环和测试多个 "numpy.isclose"值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52645000/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com