Wie wähle ich in Pandas mehrere Datenrahmenspalten aus?

101

Ich suche nach einer Möglichkeit, das Äquivalent zu SQL zu erreichen

SELECT DISTINCT col1, col2 FROM dataframe_table

Der Pandas SQL-Vergleich hat nichts zu bieten distinct.

.unique() funktioniert nur für eine einzelne Spalte, also könnte ich die Spalten wohl zusammenfassen oder in eine Liste / ein Tupel einfügen und auf diese Weise vergleichen, aber dies scheint etwas zu sein, das Pandas auf eine native Art und Weise tun sollten.

Vermisse ich etwas Offensichtliches oder gibt es keine Möglichkeit, dies zu tun?

Jody
quelle
Sie müssten so etwas tun, df.apply(pd.Series.unique)aber dies funktioniert nicht, wenn die Anzahl der eindeutigen Werte in den Spalten variiert, sodass Sie ein Diktat der Spaltennamen als Schlüssel und der eindeutigen Werte als Werte
erstellen müssen
SO-Dokumentation
user2314737

Antworten:

171

Mit der drop_duplicatesMethode können Sie die eindeutigen Zeilen in einem DataFrame abrufen:

In [29]: df = pd.DataFrame({'a':[1,2,1,2], 'b':[3,4,3,5]})

In [30]: df
Out[30]:
   a  b
0  1  3
1  2  4
2  1  3
3  2  5

In [32]: df.drop_duplicates()
Out[32]:
   a  b
0  1  3
1  2  4
3  2  5

Sie können das subsetSchlüsselwortargument auch angeben, wenn Sie nur bestimmte Spalten verwenden möchten, um die Eindeutigkeit zu bestimmen. Siehe die Dokumentzeichenfolge .

Joris
quelle
3
Möglicherweise ist zu beachten, dass es sich df.drop_duplicates()standardmäßig nicht um eine Inplace-Methode handelt. Daher wird ein neuer DataFrame zurückgegeben ( dfunverändert). Dies ist ein ziemlich normales Verhalten, kann aber dennoch nützlich sein.
Evophage
13

Ich habe verschiedene Lösungen ausprobiert. Zuerst war:

a_df=np.unique(df[['col1','col2']], axis=0)

und es funktioniert gut für Nicht-Objektdaten Eine andere Möglichkeit, dies zu tun und Fehler zu vermeiden (für den Typ der Objektspalten), besteht darin, drop_duplicates () anzuwenden.

a_df=df.drop_duplicates(['col1','col2'])[['col1','col2']]

Sie können dazu auch SQL verwenden, aber in meinem Fall hat es sehr langsam funktioniert:

from pandasql import sqldf
q="""SELECT DISTINCT col1, col2 FROM df;"""
pysqldf = lambda q: sqldf(q, globals())
a_df = pysqldf(q)
Yury Wallet
quelle
7

Es gibt keine uniqueMethode für eine df. Wenn die Anzahl der eindeutigen Werte für jede Spalte gleich wäre, würde Folgendes funktionieren: df.apply(pd.Series.unique)Wenn nicht, wird eine Fehlermeldung angezeigt. Ein anderer Ansatz wäre, die Werte in einem Diktat zu speichern, das auf dem Spaltennamen angegeben ist:

In [111]:
df = pd.DataFrame({'a':[0,1,2,2,4], 'b':[1,1,1,2,2]})
d={}
for col in df:
    d[col] = df[col].unique()
d

Out[111]:
{'a': array([0, 1, 2, 4], dtype=int64), 'b': array([1, 2], dtype=int64)}
EdChum
quelle
Ist es möglich, für mehrere Spalten nach Eindeutigkeit zu suchen?
Anoop D
Erhielt die Antwort von einer anderen SO-Frage mit numpynp.unique(df[['column1','column2']].values)
Anoop D
6

Um ein ähnliches Problem zu lösen, verwende ich groupby:

print(f"Distinct entries: {len(df.groupby(['col1', 'col2']))}")

Ob dies angemessen ist, hängt jedoch davon ab, was Sie mit dem Ergebnis tun möchten (in meinem Fall wollte ich nur das Äquivalent von COUNT DISTINCTwie gezeigt).

ncoghlan
quelle
-1

Sie können die Sätze der Spalten nehmen und einfach den kleineren Satz vom größeren Satz subtrahieren:

distinct_values = set(df['a'])-set(df['b'])
dorante
quelle