Ich möchte einen Datenrahmen durchsuchen, um einen Wert zu finden, der dem Indexzeilen- und -spaltenwert entspricht. Ich habe jedoch Probleme, weil die Spaltenüberschriftenwerte die Obergrenze eines Bereichs sind, in dem der vorherige Spaltenüberschriftenwert die Untergrenze ist (aber die Obergrenze des anderen Neightbor-Spaltenwerts).

Ich kann keine Möglichkeit finden, meine Eingabe mit der Spalte abzugleichen, die der unteren Grenze des Bereichs entspricht.

Mit einem Beispiel ist es sehr leicht zu sehen:

data_frame_test = pd.DataFrame({'location' : [1, 2, 'S'],
                                '200' : [342, 690, 103],
                                '1000' : [322, 120, 193],
                                '2000' : [249, 990, 403]})

data_frame_test = data_frame_test.set_index('location')

Und was ich tun möchte, ist dies

location = 1
weight = 500

output = data_frame_test.iloc[1][??] #must be equal to 342

Siehe, die Spalte, in die das Gewicht schauen muss, ist 200, weil sie im Bereich zwischen] 200; 1000 [liegt. Ich weiß nicht, was ich sonst noch versuchen soll, um das in Python-Code zu übersetzen. Jede Hilfe wäre sehr dankbar.

1
Murcielago 19 Feb. 2020 im 14:17

3 Antworten

Beste Antwort

Sie können eine benutzerdefinierte Funktion erstellen, die über Spalten iteriert, um die richtige Spalte zu überprüfen und dann die Zelle dieses Speicherorts zurückzugeben:

def get_val(location, weight, df):
    col = df.columns[0]
    for c in df.columns:
        if weight >= int(c):
            col = c
        else:
            break
    return df.loc[location, col]
get_val(1, 500, data_frame_test)
1
Mohit Sharma 19 Feb. 2020 im 11:27

Ich kann mir vorstellen, die Spalten auf int zu setzen und den Datenrahmen mit Series.searchsorted und boolesche Indizierung des Index:

location = 1
weight = 500 

data_frame_test.iloc[data_frame_test.index==location, 
                     data_frame_test.columns.astype('int').searchsorted(weight)-1]

location
1    342
Name: 200, dtype: int64
1
yatu 19 Feb. 2020 im 11:30

Konvertieren Sie bei Bedarf zuerst Spalten mit rename in Ganzzahlen:

data_frame_test = data_frame_test.set_index('location').rename(columns=int)
print (data_frame_test)
          200   1000  2000
location                  
1          342   322   249
2          690   120   990
S          103   193   403

weight = 500
location = 1

Ordnen Sie dann die Werte nach Positionen {{X0 }} mit der letzten Position des Werts True durch Vergleichen mit weniger Werten wie Gewicht:

#https://stackoverflow.com/a/8768734
b = (data_frame_test.columns[::-1] < weight)
pos = len(b) - np.argmax(b) - 1
print (pos)
0

output = data_frame_test.loc[location, data_frame_test.columns[pos]]
print (output)
342

Oder Sie können DataFrame.iloc mit Position von {{X1} }:

output = data_frame_test.iloc[data_frame_test.index.get_loc(location), pos]
print (output)
342
1
jezrael 19 Feb. 2020 im 11:47