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”反而)。
我相信您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)
| 归档时间: |
|
| 查看次数: |
800 次 |
| 最近记录: |