Pomyślałem, że byłoby to proste, ale miałem problem ze znalezieniem eleganckiego sposobu wyszukiwania wszystkich kolumn w ramce danych w tym samym czasie dla częściowego dopasowywania ciągów znaków. Zasadniczo jak mogę zastosować df['col1'].str.contains('^')
do całej ramka danych naraz i odfiltrować do wszystkich wierszy, które mają rekordy zawierające dopasowanie?Wyszukaj ciąg we wszystkich kolumnach DataFrame i filtru Pandy
Odpowiedz
Metoda oczekuje wzoru regex (domyślnie), a nie literału. Dlatego str.contains("^")
dopasowuje początek dowolnego ciągu znaków. Ponieważ każdy ciąg ma początek, wszystko się zgadza. Zamiast tego użyj str.contains("\^")
, aby dopasować literał do postaci ^
.
Aby sprawdzić każdą kolumnę, można użyć for col in df
iterację nazwy kolumn, a następnie zadzwonić str.contains
na każdej kolumnie:
mask = np.column_stack([df[col].str.contains(r"\^", na=False) for col in df])
df.loc[mask.any(axis=1)]
Alternatywnie, można przejść regex=False
do str.contains
zrobić test używać Pythona in
operator; ale (na ogół) używanie regex jest szybsze.
Hej @unutbu, pytanie do ciebie . Dlaczego używasz 'np.column_stack ', kiedy możesz użyć' pd.DataFrame (...). Transpose() '? – propjk007
Gdy 'maska' jest boolowską tablicą NumPy,' df.loc [maska] ' wybranych wierszy, w których' maska' jest True. Jeśli 'mask' jest ramką DataFrame, to następnie ' df.loc [maska] 'wybiera wiersze z' df', których * indeks * odpowiada wartości indeksu w 'masce', która odpowiada wartości True. To wyrównanie indeksów jest wspaniałe, gdy jest potrzebne, ale spowalnia wydajność, gdy tego nie potrzebujesz. Krótko mówiąc, jeśli nie potrzebujesz indeksu, użyj tablicy NumPy zamiast DataFrame. Ponadto tworzenie ramki DataFrame jest znacznie wolniejsze niż tworzenie tablicy NumPy, więc nie ma żadnej korzyści z używania 'pd.DataFrame ([...]) .T' tutaj. – unutbu
Nie myślałem o wpływie wydajności na podejście DataFrame. W mniejszym lub większym stopniu chodziło o dodanie kolejnego modułu (numpy) i pomyślałem, że korzystanie z funkcji w tej samej bibliotece (panda) byłoby lepsze. Widzę, że twoja metodologia na dłuższą metę jest lepsza. Dzięki @unutbu! – propjk007
spróbuj:
df.apply(lambda row: row.astype(str).str.contains('TEST').any(), axis=1)
- 1. Pandy Pythona: wartości ujemne filtru DataFrame
- 2. Jak zastąpić wszystkie wartości we wszystkich kolumnach w dataframe pandy ze stanu
- 3. Get liczbę wartości w kolumnach-pandy DataFrame
- 4. pyton pandy DataFrame poletko w kolumnach i rzędach
- 5. Jak mogę zebrać_ we wszystkich kolumnach oprócz jednego?
- 6. Konwersja pandy dataframe do csv ciąg
- 7. Czy mogę użyć filtru we wszystkich blokach kompresji oprócz jednego?
- 8. Jak obliczyć korelację między wszystkimi kolumnami w DataFrame i wszystkich kolumnach w innym DataFrame?
- 9. SQL Server: Jak wykonać Rtrim we wszystkich kolumnach varchar tabeli
- 10. MySQL - Czy można używać LIKE we wszystkich kolumnach tabeli?
- 11. Widok tabeli Javafx nie wyświetlający danych we wszystkich kolumnach
- 12. Box-cień pojawia się we wszystkich kolumnach w IE
- 13. Zastąp ciąg we wszystkich plikach w Eclipse
- 14. Pandy: transformuj wartości kolumn w niezależnych kolumnach
- 15. Pandy podzielone kolumnę list w wielu kolumnach
- 16. Pandy: Kombajny ciąg i int kolumny
- 17. jak zresetować wskaźnik pandy dataframe po dropna() Pandy dataframe
- 18. mediana pandy dataframe
- 19. pandy: normalizowanie DataFrame
- 20. Pandy hierarchiczna dataframe
- 21. pandy DataFrame problem
- 22. pandy krojenie multiindex dataframe
- 23. Zrozumienie pandy dataframe indeksowanie
- 24. Concating pandy dataframe
- 25. Dataframe Merge in Pandy
- 26. Jak obracać pandy dataframe
- 27. indeksowaniu DataFrame pandy
- 28. Konwersja pandy dataframe do dask dataframe
- 29. Python Pandy: Boolean indeksowanie na wielu kolumnach
- 30. Matrix Mnożenie z pandy DataFrame i Series
Chcesz przeszukać całą dataframe aniżeli tylko określonej kolumnie? – EdChum
Metoda 'str.contains' jest poprawna tylko dla Serii, więc musiałbyś zrobić coś takiego jak' dla col w df: df [col] .str.contains ('^') ' – EdChum