421 Stimmen

pandas: Zeilen von DataFrame mit Operatorverkettung filtern

Die meisten Operationen in pandas kann mit der Verkettung von Operatoren erreicht werden ( groupby , aggregate , apply usw.), aber die einzige Möglichkeit, die ich gefunden habe, um Zeilen zu filtern, ist über die normale Klammerindizierung

df_filtered = df[df['column'] == value]

Dies ist unattraktiv, da es erfordert, dass ich die df auf eine Variable übertragen werden, bevor man nach deren Werten filtern kann. Gibt es etwas, das mehr wie das Folgende aussieht?

df_filtered = df.mask(lambda x: x['column'] == value)

3voto

Pietro Battiston Punkte 7097

Diese Lösung ist in der Umsetzung eher hakelig, aber ich finde sie viel sauberer in der Anwendung, und sie ist sicherlich allgemeiner als die anderen vorgeschlagenen.

https://github.com/toobaz/generic_utils/blob/master/generic_utils/pandas/where.py

Sie müssen nicht das gesamte Repo herunterladen: Speichern Sie die Datei und führen Sie

from where import where as W

sollte ausreichen. Dann verwenden Sie es so:

df = pd.DataFrame([[1, 2, True],
                   [3, 4, False], 
                   [5, 7, True]],
                  index=range(3), columns=['a', 'b', 'c'])
# On specific column:
print(df.loc[W['a'] > 2])
print(df.loc[-W['a'] == W['b']])
print(df.loc[~W['c']])
# On entire - or subset of a - DataFrame:
print(df.loc[W.sum(axis=1) > 3])
print(df.loc[W[['a', 'b']].diff(axis=1)['b'] > 1])

Ein etwas weniger dummes Anwendungsbeispiel:

data = pd.read_csv('ugly_db.csv').loc[~(W == '$null$').any(axis=1)]

Übrigens: Auch in dem Fall, in dem Sie nur boolesche Spalten verwenden,

df.loc[W['cond1']].loc[W['cond2']]

kann viel effizienter sein als

df.loc[W['cond1'] & W['cond2']]

denn es wertet aus cond2 nur wenn cond1 es True .

DISCLAIMER: Ich habe diese Antwort zuerst gegeben anderswo weil ich das noch nicht gesehen hatte.

3voto

serv-inc Punkte 32204

Dies ist unattraktiv, da es erfordert, dass ich die df auf eine Variable übertragen werden, bevor man nach deren Werten filtern kann.

df[df["column_name"] != 5].groupby("other_column_name")

scheint zu funktionieren: Sie können die [] Operator auch. Vielleicht haben sie es hinzugefügt, seit Sie die Frage gestellt haben.

3voto

Cam Punkte 879

Meiner Meinung nach müssen Sie also zwei Dinge tun, wenn Sie eine Teilmenge Ihrer Daten für die Analyse bereitstellen.

  • Zeilen holen
  • Spalten holen

Pandas bietet eine Reihe von Möglichkeiten, diese Aufgaben zu erfüllen, und einige Techniken, die dabei helfen, Reihen zu bilden y Spalten. Für neue Pandas-Benutzer kann es verwirrend sein, da es so viele Möglichkeiten gibt.

Verwenden Sie iloc, loc, brackets, query, isin, np.where, mask usw.?

Methodenverkettung

Die Methodenverkettung ist eine großartige Möglichkeit, mit Daten zu arbeiten. In R gibt es eine einfache Möglichkeit, dies zu tun: Sie select() Spalten und Sie filter() Reihen.

Wenn wir also die Dinge in Pandas einfach halten wollen, warum verwenden wir nicht die filter() für Spalten und die query() für Zeilen. Beide geben Datenrahmen zurück, so dass keine Notwendigkeit besteht, mit boolescher Indizierung herumzupfuschen, keine Notwendigkeit, die df[ ] runden den Rückgabewert.

Und wie sieht das aus:-

df.filter(['col1', 'col2', 'col3']).query("col1 == 'sometext'")

Sie können dann alle anderen Methoden wie groupby , dropna() , sort_values() , reset_index() usw. usw.

Durch konsequentes Handeln und die Verwendung von filter() um Ihre Spalten zu erhalten und query() um Ihre Zeilen zu erhalten, wird es einfacher sein, Ihren Code zu lesen, wenn Sie nach einiger Zeit darauf zurückkommen.

Aber Filter können Zeilen auswählen?

Ja, das ist richtig, aber standardmäßig query() Zeilen erhalten und filter() Spalten erhalten. Wenn Sie also die Standardeinstellung beibehalten, ist es nicht notwendig, die axis= Parameter.

Abfrage()

query() kann mit beiden verwendet werden and / or & / | können Sie auch Vergleichsoperatoren verwenden > , < , >= , <=, ==, != . Sie können auch Python in, nicht in verwenden.

Mit @my_list können Sie eine Liste an die Abfrage übergeben

Einige Beispiele für die Verwendung von Abfragen zum Abrufen von Zeilen

df.query('A > B')

df.query('a not in b')

df.query("series == '2206'")

df.query("col1 == @mylist")

df.query('Salary_in_1000 >= 100 & Age < 60 & FT_Team.str.startswith("S").values')

filter()

Filter ist also im Grunde wie die Verwendung von Klammern df[] o df[[]] insofern, als es die Beschriftungen zur Auswahl von Spalten verwendet. Aber es tut mehr als nur die Klammerschreibweise.

Filter hat like= Parameter, um die Auswahl von Spalten mit unvollständigen Namen zu erleichtern.

df.filter(like='partial_name',)

Filter hat auch Regex, um bei der Auswahl zu helfen

df.filter(regex='reg_string')

Zusammenfassend lässt sich also sagen, dass diese Arbeitsweise nicht für jede Situation geeignet ist, z. B. wenn Sie Indizierung/Slicing verwenden möchten, dann ist iloc der richtige Weg. Aber dies scheint eine solide Arbeitsweise zu sein und kann Ihren Arbeitsablauf und Code vereinfachen.

2voto

Akash Basudevan Punkte 820

Sie können auch die numpy Bibliothek für logische Operationen. Sie ist ziemlich schnell.

df[np.logical_and(df['A'] == 1 ,df['B'] == 6)]

1voto

naught101 Punkte 17337

Wenn Sie Ihre Spalten für die Suche als Indizes festlegen, können Sie DataFrame.xs() um einen Querschnitt zu machen. Dies ist nicht so vielseitig wie die query Antworten, aber es könnte in manchen Situationen nützlich sein.

import pandas as pd
import numpy as np

np.random.seed([3,1415])
df = pd.DataFrame(
    np.random.randint(3, size=(10, 5)),
    columns=list('ABCDE')
)

df
# Out[55]: 
#    A  B  C  D  E
# 0  0  2  2  2  2
# 1  1  1  2  0  2
# 2  0  2  0  0  2
# 3  0  2  2  0  1
# 4  0  1  1  2  0
# 5  0  0  0  1  2
# 6  1  0  1  1  1
# 7  0  0  2  0  2
# 8  2  2  2  2  2
# 9  1  2  0  2  1

df.set_index(['A', 'D']).xs([0, 2]).reset_index()
# Out[57]: 
#    A  D  B  C  E
# 0  0  2  2  2  2
# 1  0  2  1  1  0

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X