2016-12-19 17 views
5

zakładają łatwy dataframe npZdobądź indeks rzędzie dataframe pandy jako liczba całkowita

A   B 
0 1 0.810743 
1 2 0.595866 
2 3 0.154888 
3 4 0.472721 
4 5 0.894525 
5 6 0.978174 
6 7 0.859449 
7 8 0.541247 
8 9 0.232302 
9 10 0.276566 

Jak mogę odzyskać wartość indeksu rzędu, biorąc pod uwagę stan? Na przykład: dfb = df[df['A']==5].index.values.astype(int) zwraca [4], ale to, co chciałbym uzyskać, to tylko 4. To sprawia mi kłopoty później w kodzie.

Na podstawie pewnych warunków chcę mieć listę indeksów, w których ten warunek jest spełniony, a następnie wybierz wiersze między.

Próbowałem

dfb = df[df['A']==5].index.values.astype(int) 
dfbb = df[df['A']==8].index.values.astype(int) 
df.loc[dfb:dfbb,'B'] 

dla pożądanej wydajności

A   B 
4 5 0.894525 
5 6 0.978174 
6 7 0.859449 

ale mam TypeError: '[4]' is an invalid key

Odpowiedz

6

łatwiej jest dodać [0] - wybierz pierwszą wartość liście z jednego elementu:

dfb = df[df['A']==5].index.values.astype(int)[0] 
dfbb = df[df['A']==8].index.values.astype(int)[0] 

dfb = int(df[df['A']==5].index[0]) 
dfbb = int(df[df['A']==8].index[0]) 

Wtedy wydaje się potrzeba odejmowania 1:

print (df.loc[dfb:dfbb-1,'B']) 
4 0.894525 
5 0.978174 
6 0.859449 
Name: B, dtype: float64 

Innym rozwiązaniem z boolean indexing lub query:

print (df[(df['A'] >= 5) & (df['A'] < 8)]) 
    A   B 
4 5 0.894525 
5 6 0.978174 
6 7 0.859449 

print (df.loc[(df['A'] >= 5) & (df['A'] < 8), 'B']) 
4 0.894525 
5 0.978174 
6 0.859449 
Name: B, dtype: float64 

print (df.query('A >= 5 and A < 8')) 
    A   B 
4 5 0.894525 
5 6 0.978174 
6 7 0.859449 
4

Charakter do włączenia wiersza, w którym A == 5 i wszystkich wierszy do góry, ale nie, w tym wiersza, gdzie A == 8 oznacza, że ​​w końcu będziemy używać iloc (loc zawiera oba końce plasterka).

Aby uzyskać etykiety indeksu, używamy idxmax. Spowoduje to powrót do pierwszej pozycji wartości maksymalnej. Uruchomiłem to na serii boolowskiej, gdzie A == 5 (wtedy gdy A == 8), która zwraca wartość indeksu, kiedy pierwszy raz występuje A == 5 (to samo dla A == 8).

Następnie używam searchsorted, aby znaleźć pozycję porządkową, w której występuje etykieta indeksu (którą znalazłem powyżej). Właśnie tego używam w iloc.

i5, i8 = df.index.searchsorted([df.A.eq(5).idxmax(), df.A.eq(8).idxmax()]) 
df.iloc[i5:i8] 

enter image description here


numpy

można dodatkowo zwiększyć ten za pomocą podstawowych numpy obiektów analogiczne funkcje NumPy. Zapakowałem go w przydatną funkcję.

def find_between(df, col, v1, v2): 
    vals = df[col].values 
    mx1, mx2 = (vals == v1).argmax(), (vals == v2).argmax() 
    idx = df.index.values 
    i1, i2 = idx.searchsorted([mx1, mx2]) 
    return df.iloc[i1:i2] 

find_between(df, 'A', 5, 8) 

enter image description here


rozrządu
enter image description here

6

Aby odpowiedzieć na oryginalne pytanie, w jaki sposób uzyskać indeks w postaci liczby całkowitej dla pożądanej selekcji dodaje zadziała :

df[df['A']==5].index.item()