2015-07-13 12 views
5

Używam Pandy dłużej niż 3 miesiące i mam sprawiedliwy pomysł o dataframes dostępu i zapytań itpużyciem podobnych wewnątrz pandas.query()

Mam wymóg gdzie chciałem kwerendy ramka danych używająca słowa kluczowego LIKE (LIKE podobnego do SQL) w pandas.query().

tj: próbuję wykonać pandas.query ("nazwa_kolumny LIKE '%' abc") poleceniem ale jego awarii.

Znam alternatywne podejście, które ma używać str.contains ("abc%"), ale nie spełnia naszych wymagań.

Chcieliśmy wykonać LIKE wewnątrz pandas.query(). Jak mogę to zrobić?

+0

Minęło trochę czasu od opublikowania tego pytania: czy znaleziono rozwiązanie tego problemu, czy jest to nadal możliwe do uzyskania tylko przez 'str.contains()'? – user1717828

Odpowiedz

2

Nie używając zapytania(), ale to da ci to, czego szukasz:

df[df.col_name.str.startswith('abc')] 


df 
Out[93]: 
    col_name 
0  this 
1  that 
2  abcd 

df[df.col_name.str.startswith('abc')] 
Out[94]: 
    col_name 
2  abcd 

Query używa pandy eval() i ogranicza się w tym, co można wykorzystać w nim. Jeśli chcesz użyć czystego SQL można rozważyć pandasql gdzie następujące oświadczenie będzie pracować dla Ciebie:

sqldf("select col_name from df where col_name like 'abc%';", locals()) 

lub na przemian, czy problem z pand str metody było, że kolumna nie była całkowicie od typu string można było Wykonaj następujące czynności:

df[df.col_name.str.startswith('abc').fillna(False)] 
+0

Próbowałem SQLDF, to rozwiązuje mój problem, ale widzę z nim ogromny problem z wydajnością. Dodałem 95lakhs rekordów ze zwykłym df.query() i mogłem uzyskać wynik w 1min. ale jeśli korzystam z SQLDF, to zajmuje to minimum 10 minut. –

+0

SQLDF tworzy i odrywa bazę danych sqlite, a więc wydajność osiąga. Czy istnieje powód, dla którego nie można używać startswith()? – khammel

4

Bardzo późno na to stanowisko, ale dla każdego, kto się z nim spotka. Możesz użyć indeksowania boolean, określając kryteria wyszukiwania na podstawie metody sprawdzania ciągów znaków: str.contains.

przykład:

dataframe[dataframe.summary.str.contains('Windows Failed Login', case=False)] 

W kodzie powyżej, fragment wewnątrz nawiasach odnosi się do kolumny podsumowania w dataframe i wykorzystuje metodę .str.contains szukać 'Windows Failed Login' w każdej wartości tej serii. Wielkość liter może być ustawiona na wartość true lub false. Spowoduje to zwrócenie indeksu boolowskiego, który jest następnie wykorzystywany do zwracania szukanej ramki danych. Możesz użyć .fillna() z tym w nawiasach, jeśli natkniesz się na błędy Nan.

Mam nadzieję, że to pomoże!

+0

To jest świetna odpowiedź !! – sushmit

+0

Nie miałem kolumny podsumowania, więc dla losowej nazwy kolumny można użyć 'new_df = df [df ['Column'] .str.contains (" coś ")]' – arie64

Powiązane problemy