2015-05-28 30 views
13

Tôi đang cố tìm số lượng giá trị riêng biệt trong mỗi cột bằng cách sử dụng Pandas. Đây là những gì tôi đã làm.Tìm số phần tử riêng biệt trong DataFrame trong mỗi cột

import pandas as pd 

df = pd.read_csv('train.csv') 
# print(df) 

a = pd.unique(df.values.ravel()) 
print(a) 

Tính các phần tử duy nhất trong DataFrame bất kể hàng/cột, nhưng tôi cần tính cho mỗi cột có đầu ra được định dạng như dưới đây.

policyID    0 
statecode    0 
county    0 
eq_site_limit   0 
hu_site_limit   454 
fl_site_limit   647 
fr_site_limit   0 
tiv_2011    0 
tiv_2012    0 
eq_site_deductible 0 
hu_site_deductible 0 
fl_site_deductible 0 
fr_site_deductible 0 
point_latitude  0 
point_longitude  0 
line     0 
construction   0 
point_granularity  0 

Cách hiệu quả nhất để làm điều này, vì phương pháp này sẽ được áp dụng cho các tệp có kích thước lớn hơn 1,5 GB?


Dựa trên câu trả lời, df.apply(lambda x: len(x.unique())) là nhanh nhất.

In[23]: %timeit df.apply(pd.Series.nunique) 
1 loops, best of 3: 1.45 s per loop 
In[24]: %timeit df.apply(lambda x: len(x.unique())) 
1 loops, best of 3: 335 ms per loop 
In[25]: %timeit df.T.apply(lambda x: x.nunique(), axis=1) 
1 loops, best of 3: 1.45 s per loop 

Trả lời

16

Bạn có thể làm một transpose của df và sau đó sử dụng apply gọi nunique hàng khôn ngoan:

In [205]: 
df = pd.DataFrame({'a':[0,1,1,2,3],'b':[1,2,3,4,5],'c':[1,1,1,1,1]}) 
df 

Out[205]: 
    a b c 
0 0 1 1 
1 1 2 1 
2 1 3 1 
3 2 4 1 
4 3 5 1 

In [206]: 
df.T.apply(lambda x: x.nunique(), axis=1) 

Out[206]: 
a 4 
b 5 
c 1 
dtype: int64 

EDIT

Như đã chỉ ra bởi @ajcr các transpose là không cần thiết:

In [208]: 
df.apply(pd.Series.nunique) 

Out[208]: 
a 4 
b 5 
c 1 
dtype: int64 

Tính đến gấu trúc 0,20 chúng ta có thể sử dụng trực tiếp trên nunique dataframe tức là

df.nunique() 
a 4 
b 5 
c 1 
dtype: int64 
+5

Tương tự như vậy tôi nghĩ 'df.apply (pd.Series.nunique)' cũng sẽ hoạt động (và tránh cần phải chuyển đổi nếu đó là vấn đề) . –

+0

@ajcr có đó là tốt hơn thực sự, ban đầu tôi nghĩ rằng transpose là cần thiết để có được các cột như các giá trị chỉ số – EdChum

+0

Làm thế nào để chỉ đếm tổng số lần xuất hiện duy nhất? –

0

Gần đây, tôi có vấn đề tương tự đếm giá trị độc đáo của mỗi cột trong DataFrame, và tôi thấy một số chức năng khác chạy nhanh hơn so với apply chức năng:

#Select the way how you want to store the output, could be pd.DataFrame or Dict, I will use Dict to demonstrate: 
col_uni_val={} 
for i in df.columns: 
    col_uni_val[i] = len(df[i].unique()) 

#Import pprint to display dic nicely: 
import pprint 
pprint.pprint(col_uni_val) 

này làm việc cho tôi gần gấp đôi nhanh hơn df.apply(lambda x: len(x.unique()))

0

Đã một số câu trả lời tuyệt vời ở đây :) nhưng điều này dường như bị mất tích:

df.apply(lambda x: x.nunique()) 

Và thậm chí tốt hơn tin tức, DataFrame.nunique() sẽ có trong phiên bản 0.20.0: github of this issue

Các vấn đề liên quan