2015-05-29 19 views
36

Sto cercando un modo per fare l'equivalente a SQLCome "selezionare distinto" tra più colonne del frame di dati nei panda?

"SELECT col1 DISTINTO, col2 FROM dataframe_table"

Il panda confronto SQL non ha nulla di "distinta"

.unique() funziona solo per una singola colonna, quindi suppongo di poter concatenare le colonne, o metterle in una lista/tupla e confrontare in questo modo, ma questo sembra che qualcosa di panda debba fare in un modo più nativo .

Mi manca qualcosa di ovvio, o non c'è modo di farlo?

+0

dovreste fare qualcosa di simile 'df.apply (pd.Series.unique)', ma questo non funzionerà se il numero di valori univoci varia tra le colonne, quindi dovresti costruire un ditt dei nomi delle colonne come chiavi e i valori univoci come i valori – EdChum

+0

[SO Documentation] (http://stackoverflow.com)/documentation/pandas/1751/indexing and select-data/26077/select-distinct-rows-across-dataframe) – user2314737

risposta

70

È possibile utilizzare il metodo drop_duplicates per ottenere le righe uniche in un dataframe:

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 

Puoi fornire anche l'argomento della parola chiave subset se si desidera utilizzare determinate colonne solo per determinare l'unicità. Vedi lo docstring.

+3

metodo migliore del mio +1 – EdChum

3

Non esiste un metodo unique per un df, se il numero di valori univoci per ogni colonna fosse lo stesso, funzionerebbe: df.apply(pd.Series.unique) ma in caso contrario si otterrà un errore. Un altro approccio sarebbe quello di memorizzare i valori in un dict che viene digitato sul nome della colonna:

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)} 
0

Si può prendere i set delle colonne e basta sottrarre il set più piccolo dal set più ampio:

distinct_values = set(df['a'])-set(df['b']) 
Problemi correlati