2015-05-29 34 views
36

Tôi đang tìm kiếm một cách để làm tương đương với sqlCách "chọn riêng biệt" trên nhiều cột khung dữ liệu trong gấu trúc?

"SELECT DISTINCT col1, col2 TỪ dataframe_table"

Các gấu trúc sql so sánh không có bất cứ điều gì về "khác biệt" .unique() chỉ hoạt động cho một cột duy nhất, vì vậy tôi cho rằng tôi có thể concat các cột, hoặc đặt chúng trong một danh sách/tuple và so sánh theo cách đó, nhưng điều này có vẻ như một cái gì đó gấu trúc nên làm theo một cách bản địa hơn .

Tôi có thiếu điều gì đó hiển nhiên hay không có cách nào để thực hiện việc này?

+0

Bạn sẽ phải làm điều gì đó như 'df.apply (pd.Series.unique)' nhưng điều này sẽ không hoạt động nếu số lượng giá trị duy nhất thay đổi trên các cột, do đó bạn phải xây dựng một dict của các tên cột làm khóa và các giá trị duy nhất như các giá trị – EdChum

+0

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

Trả lời

70

Bạn có thể sử dụng phương pháp drop_duplicates để có được các hàng duy nhất trong một 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 

Bạn có thể cũng cung cấp đối số từ khóa subset nếu bạn chỉ muốn sử dụng các cột nhất định để xác định tính duy nhất. Xem docstring.

+3

phương pháp tốt hơn so với tôi +1 – EdChum

3

Không có phương pháp unique cho df, nếu số lượng giá trị duy nhất cho mỗi cột giống nhau thì điều sau sẽ hoạt động: df.apply(pd.Series.unique) nhưng nếu không thì bạn sẽ gặp lỗi. cách tiếp cận khác là để lưu trữ các giá trị trong một dict được keyed vào tên cột:

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

Bạn có thể lấy bộ các cột và chỉ trừ các thiết lập nhỏ hơn từ tập lớn:

distinct_values = set(df['a'])-set(df['b']) 
Các vấn đề liên quan