2015-05-29 56 views
36

我正在尋找一個方式做等效於SQL如何在熊貓的多個數據框列中「選擇不同」?

「SELECT DISTINCT COL1,COL2 FROM dataframe_table」

大熊貓的SQL比較沒有任何東西 「不同」我想我可以將列連接起來,或者把它們放在一個列表/元組中,然後比較這種方式,但是這看起來像是大熊貓應該以更原始的方式進行操作。

我錯過了一些明顯的東西,還是沒有辦法做到這一點?

+0

你不得不這樣做'df.apply(pd.Series.unique)'但如果唯一值的數目在列之間變化,那麼這將不起作用,因此您必須將列名的字典作爲關鍵字並將唯一值構造爲值 – EdChum

+0

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

回答

70

可以使用drop_duplicates方法得到的數據幀中的唯一行:

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 

你可以如果您只想使用某些列來確定唯一性,則還提供subset關鍵字參數。請參閱docstring

+3

比我的更好的方法+1 – EdChum

3

對於df沒有unique方法,如果每列的唯一值的數目是相同的,那麼以下方法將工作:df.apply(pd.Series.unique)但如果不是,那麼您將得到一個錯誤。另一種方法是將值存儲在其中列名鍵的字典:

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

您可以乘坐列集和從大集只是減去小集:

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