2015-05-29 54 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'])