Làm cách nào để "chọn riêng biệt" trên nhiều cột khung dữ liệu ở gấu trúc?


101

Tôi đang tìm cách làm tương đương với SQL

SELECT DISTINCT col1, col2 FROM dataframe_table

So sánh pandas sql không có bất cứ điều gì về distinct.

.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ể nối các cột hoặc đặt chúng vào một danh sách / tuple và so sánh theo cách đó, nhưng điều này có vẻ như điều gì đó gấu trúc nên làm theo cách nguyên bản hơn.

Tôi đang thiếu một cái gì đó rõ ràng, hay là không có cách nào để làm điều này?


Bạn sẽ phải làm điều gì đó tương tự 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 khác nhau trên các cột, vì vậy bạn phải tạo một chính tả của tên cột làm khóa và giá trị duy nhất làm giá trị
EdChum

Câu trả lời:


172

Bạn có thể sử dụng drop_duplicatesphương pháp để lấy các hàng duy nhất trong 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ũng có thể cung cấp subsetđối số từ khóa nếu bạn chỉ muốn sử dụng một số cột nhất định để xác định tính duy nhất. Xem docstring .


3
Có thể đáng chú ý rằng df.drop_duplicates()theo mặc định không phải là một phương thức thay thế, vì vậy trả về một DataFrame mới ( dfkhông thay đổi). Đây là hành vi khá tiêu chuẩn, nhưng vẫn có thể hữu ích.
evophage

13

Tôi đã thử các giải pháp khác nhau. Đầu tiên là:

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

và nó hoạt động tốt đối với không phải dữ liệu đối tượng Một cách khác để làm điều này và để tránh lỗi (đối với loại cột đối tượng) là áp dụng drop_duplicates ()

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

Bạn cũng có thể sử dụng SQL để thực hiện việc này, nhưng nó hoạt động rất chậm trong trường hợp của tôi:

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

7

Không có uniquephương pháp nào cho df, nếu số lượng giá trị duy nhất cho mỗi cột là như nhau thì cách sau sẽ hoạt động: df.apply(pd.Series.unique)nhưng nếu không thì bạn sẽ gặp lỗi. Một cách tiếp cận khác sẽ là lưu trữ các giá trị trong một chính tả được khóa trên 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)}

có thể kiểm tra tính duy nhất cho nhiều cột không?
Anoop D

Nhận được câu trả lời từ một câu hỏi SO khác bằng cách sử dụng numpynp.unique(df[['column1','column2']].values)
Anoop D

6

Để giải quyết một vấn đề tương tự, tôi đang sử dụng groupby:

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

Tuy nhiên, điều đó có phù hợp hay không sẽ phụ thuộc vào những gì bạn muốn làm với kết quả (trong trường hợp của tôi, tôi chỉ muốn tương đương với COUNT DISTINCTnhư được hiển thị).



-1

Bạn có thể lấy tập hợp các cột và chỉ cần trừ tập hợp nhỏ hơn khỏi tập hợp lớn hơn:

distinct_values = set(df['a'])-set(df['b'])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.