Wie kann ich alle Zeilen in einem Datenframe mit Werten in der Nähe von Nummern, die ich eingeben, ausgeben?

import pandas as pd

data = {'A':[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
        'B':[11, 12, 13, 14, 15, 16, 17, 18, 19, 20]}

df = pd.DataFrame(data, columns=['A', 'B'])

So eine Funktion wie nearest_values(df, A, B), die Zeilen innerhalb von 2 der angegebenen Eingänge ausgibt. Wenn ich {nearest_values(df 5, 15) einging, würde es Reihen zurückkehren:

|     A    |     B    |
| -------- | -------- |
| 3        | 13       |
| 4        | 14       |
| 5        | 15       |
| 6        | 16       |
| 7        | 17       |
0
RDTJr 3 Juni 2021 im 00:50

1 Antwort

Beste Antwort

Eine Möglichkeit wäre, die Werte aus dem Datenframe abzusetzen und mit einer Toleranz zu vergleichen:

def nearest_values(df, A, B, tolerance=2):
    return df[(abs(df - [A, B]) <= tolerance).all(axis=1)]

(Dies kann auch für N-Spalten sein):

def nearest_values(df, *cols, tolerance=2):
    return df[(abs(df - cols) <= tolerance).all(axis=1)]

nearest_values(df, 5, 15):

   A   B
2  3  13
3  4  14
4  5  15
5  6  16
6  7  17

Wenn ein Wert in der Zeile, der der Toleranz entspricht, akzeptabel ist, ändern Sie {all in {{{any.


Erläuterung:

df - [A, B]

Verwendet Subtraktion, um die Suchwerte gegen den Datenframe zu "vergleichen":

   A  B
0 -4 -4
1 -3 -3
2 -2 -2
3 -1 -1
4  0  0
5  1  1
6  2  2
7  3  3
8  4  4
9  5  5

abs wird angewendet, um alle negativen Werte auf positive Werte umzuwandeln, dann erfolgt ein Vergleich gegen die Toleranz:

abs(df - [A, B]) <= tolerance
       A      B
0  False  False
1  False  False
2   True   True
3   True   True
4   True   True
5   True   True
6   True   True
7  False  False
8  False  False
9  False  False

Dann kann eine Bewertung über die Wahrhaftigkeit einer bestimmten Reihe erfolgen. In diesem Fall ist all(axis=1), aber {any(axis=1) ist auch eine Option:

(abs(df - [A, B]) <= tolerance).all(axis=1)
0    False
1    False
2     True
3     True
4     True
5     True
6     True
7    False
8    False
9    False
dtype: bool

Dies kann als Index verwendet werden, um die gewünschten Reihen auszuwählen:


Komplettes Arbeitsbeispiel

import pandas as pd

data = {'A': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
        'B': [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]}

df = pd.DataFrame(data, columns=['A', 'B'])


def nearest_values(df, *cols, tolerance=2):
    return df[(abs(df - cols) <= tolerance).all(axis=1)]


print(nearest_values(df, 5, 15))
2
Henry Ecker 2 Juni 2021 im 21:58