如何在数据框的列上循环和测试多个“numpy.isclose”值?

Nek*_*eko 4 numpy python-3.x pandas

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

df[df[['column']].apply(numpy.isclose, b=A, atol=0.004).any(1)]
Run Code Online (Sandbox Code Playgroud)

但是,在某些情况下,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
Run Code Online (Sandbox Code Playgroud)

其中 A 具有值:

A=[0.432, 0.783, 0.902]
Run Code Online (Sandbox Code Playgroud)

但在另一个示例中,它可能具有以下值:

A=[0.558, 0.002]
Run Code Online (Sandbox Code Playgroud)

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

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

jez*_*ael 7

我相信您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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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]]
Run Code Online (Sandbox Code Playgroud)

最后通过以下方式获取True每行的所有值any

print (m.any(axis=1))
[ True False False False False False False  True False  True]
Run Code Online (Sandbox Code Playgroud)

最后过滤器boolean indexing

print (df[m.any(axis=1)])
     column
0  0.902062
7  0.432289
9  0.783643
Run Code Online (Sandbox Code Playgroud)