pd.unique
trả về các giá trị duy nhất từ một mảng đầu vào hoặc cột hoặc chỉ mục DataFrame.
Đầu vào của hàm này cần phải là một chiều, do đó, nhiều cột sẽ cần được kết hợp. Cách đơn giản nhất là chọn các cột bạn muốn và sau đó xem các giá trị trong một mảng NumPy được làm phẳng. Toàn bộ hoạt động trông như thế này:
>>> pd.unique(df[['Col1', 'Col2']].values.ravel('K'))
array(['Bob', 'Joe', 'Bill', 'Mary', 'Steve'], dtype=object)
Lưu ý rằng đó ravel()
là một phương thức mảng hơn trả về một khung nhìn (nếu có thể) của một mảng nhiều chiều. Đối số 'K'
cho biết phương thức làm phẳng mảng theo thứ tự các phần tử được lưu trữ trong bộ nhớ (gấu trúc thường lưu trữ các mảng bên dưới theo thứ tự tiếp giáp Fortran ; các cột trước các hàng). Điều này có thể nhanh hơn đáng kể so với sử dụng thứ tự 'C' mặc định của phương thức.
Một cách khác là chọn các cột và chuyển chúng tới np.unique
:
>>> np.unique(df[['Col1', 'Col2']].values)
array(['Bill', 'Bob', 'Joe', 'Mary', 'Steve'], dtype=object)
Không cần sử dụng ravel()
ở đây vì phương thức xử lý các mảng nhiều chiều. Mặc dù vậy, điều này có khả năng chậm hơnpd.unique
với việc nó sử dụng thuật toán dựa trên sắp xếp thay vì hashtable để xác định các giá trị duy nhất.
Sự khác biệt về tốc độ rất có ý nghĩa đối với DataFrames lớn hơn (đặc biệt là nếu chỉ có một số giá trị duy nhất):
>>> df1 = pd.concat([df]*100000, ignore_index=True) # DataFrame with 500000 rows
>>> %timeit np.unique(df1[['Col1', 'Col2']].values)
1 loop, best of 3: 1.12 s per loop
>>> %timeit pd.unique(df1[['Col1', 'Col2']].values.ravel('K'))
10 loops, best of 3: 38.9 ms per loop
>>> %timeit pd.unique(df1[['Col1', 'Col2']].values.ravel()) # ravel using C order
10 loops, best of 3: 49.9 ms per loop
df1.groupby(['A','B']).size().reset_index().rename(columns={0:'count'})