Mam tak sformatowaną ramkę danych w pandach.

(df)
School ID      Column 1       Column 2     Column 3
School 1                      8100         8200  
School 2       9-999 
School 3                      9300         9500 
School 4                      7700         7800 
School 5       8999
....

Chcę być w stanie wprowadzić wartość, na przykład, jeśli wartość jest bezpośrednim hitem kolumny 1 (typu ciągów), takich jak numer wejścia: 9-999, powróciłoby to

Input Number: 9-999

School ID     Column 1
School 2      9-999

Ale jeśli wprowadzony numer znajduje się między liczbami w kolumnie 2 i 3 (pływa), chciałbym zwrócić powiązany identyfikator szkoły, taki jak to.

Input Number: 8110

School ID      Column 2    Column 3
School 5       8100        8200

W tej chwili mam ten kod:

def find(num) :
d1=df.loc[df['Column 1']==num]
if len(d1)>0 :
    return d1[['School ID','Column 1']]
else :
    return df.loc[(num>= df['Column 2']) & (num<= df['Column 3'])][['School ID','Column 2','Column 3']]

Ale otrzymuję błąd mówiący: "Powrót" Funkcja zewnętrzna

Dzięki za pomoc.

1
Derek Fisher 20 październik 2020, 20:34

1 odpowiedź

Najlepsza odpowiedź
s = '9-999'

q = df[df['Column_1']==str(s)]

if len(q):
    print(q)
else:
    m = df[['Column_2', 'Column_3']].apply(lambda x: x['Column_2'] <= s <= x['Column_3'], axis=1)
    print(df[m])

Wydruki:

  School_ID Column_1  Column_2  Column_3
1  School 2    9-999       0.0       0.0

Dla s = 8110:

  School_ID Column_1  Column_2  Column_3
0  School 1        0    8100.0    8200.0

Edytuj: Aby mieć spójne typy danych, możesz konwertować kolumnę 2 i kolumnę, aby płynąć:

s = '8110'

q = df[df['Column_1']==str(s)]

df['Column_2'] = df['Column_2'].astype(float)
df['Column_3'] = df['Column_3'].astype(float)

if len(q):
    print(q)
else:
    s = float(s)
    m = df[['Column_2', 'Column_3']].apply(lambda x: x['Column_2'] <= s <= x['Column_3'], axis=1)
    print(df[m])
1
Andrej Kesely 20 październik 2020, 18:03