Số lượng gấu trúc (khác biệt) tương đương


289

Tôi đang sử dụng gấu trúc làm công cụ thay thế db vì tôi có nhiều cơ sở dữ liệu (oracle, mssql, v.v.) và tôi không thể tạo một chuỗi các lệnh thành tương đương SQL.

Tôi có một bảng được tải trong DataFrame với một số cột:

YEARMONTH, CLIENTCODE, SIZE, .... etc etc

Trong SQL, để đếm số lượng khách hàng khác nhau mỗi năm sẽ là:

SELECT count(distinct CLIENTCODE) FROM table GROUP BY YEARMONTH;

Và kết quả sẽ là

201301    5000
201302    13245

Làm thế nào tôi có thể làm điều đó trong gấu trúc?


Tôi đã thực hiện bảng.groupby (['YEARMONTH']) ['CLIENTCODE']. Unique () và đi kèm với hai chuỗi được YEARMONTH lập chỉ mục và với tất cả các giá trị duy nhất. Làm thế nào để đếm số lượng giá trị trên mỗi chuỗi?
Adriano Almeida

Đối với một số người, value_countscó thể là câu trả lời mà bạn đang tìm kiếm: pandas.pydata.org/pandas-docs/urdy/generated/ Kẻ
sachinruk

Câu trả lời:


434

Tôi tin rằng đây là những gì bạn muốn:

table.groupby('YEARMONTH').CLIENTCODE.nunique()

Thí dụ:

In [2]: table
Out[2]: 
   CLIENTCODE  YEARMONTH
0           1     201301
1           1     201301
2           2     201301
3           1     201302
4           2     201302
5           2     201302
6           3     201302

In [3]: table.groupby('YEARMONTH').CLIENTCODE.nunique()
Out[3]: 
YEARMONTH
201301       2
201302       3

2
Điều gì xảy ra nếu tôi có nhiều cột mà tôi muốn là duy nhất cùng nhau, như trong .drop_d repeatates (subset = ['col1', 'col2'])?
ErnestScripbler

4
Làm thế nào để truy cập số lượng duy nhất này. Vì không có tên cột
Tarun Khaneja

Cảm ơn rất nhiều, tôi đã sử dụng phong cách này trên đầu ra của mẫu. df_watch_record.resample ('M'). user.nunique () đếm số lượng người dùng duy nhất đã xem phim mỗi tháng.
Mehdi Kazemi

1
và sắp xếp chúng với table.groupby ('YEARMONTH'). CLIENTCODE.nunique (). sort_values ​​(asceinating = false)
wllbll

Có thể lấy lại định danh nhóm sau nunique? Hãy thử như tôi có thể tôi không thể tìm ra cách nào, vì kết quả của câu trả lời này là a Series, không phải a DataFrame.
Josh Hansen

93

Đây là một phương pháp khác, rất đơn giản, giả sử tên khung dữ liệu của bạn là daatvà tên cột làYEARMONTH

daat.YEARMONTH.value_counts()

1
Tôi thích câu trả lời này. Làm cách nào tôi có thể sử dụng phương pháp này nếu tên cột của tôi có '.' trong đó (ví dụ: 'ck.Class')? Cảm ơn

5
daat ['ck.Class']. value_counts ()
StatguyUser

28
Điều này không giải quyết câu hỏi được hỏi.
Aaron Schumacher

6
điều này đếm số lượng quan sát trong mỗi nhóm, không phải giá trị duy nhất của một cột nhất định mà mỗi nhóm có.
Mục tiêu Jason

2
Đây là câu trả lời không chính xác; nó không phản ánh DISTINCTyêu cầu từ câu hỏi! Hơn nữa, nó không bao gồm số lượng NaN!
Corey Levinson

47

Thật thú vị, rất thường len(unique())là nhanh hơn một vài lần (3x-15x) nunique().


11
Ý bạn là? .CLIENTCODE.apply(lambda x: len(x.unique())), từ đây
user4015990

6
@ user32185 bạn phải thả nó vào một applycuộc gọi với lambda. Ví dụ , df.groupby('YEARMONTH')['CLIENTCODE'].apply(lambda x: x.unique().shape[0]).
3novak

3
Cú pháp không hoàn toàn rõ ràng, tôi đã sử dụng len(df['column'].unique())không cần chức năng lambda
mlh351

Tôi nhận được TypeError: object of type 'method' has no len()từ Chen'snhận xét, 3novak'slàm việc cho tôi.
Mục tiêu Jason

4

Sử dụng crosstab, điều này sẽ trả lại nhiều thông tin hơngroupby nunique

pd.crosstab(df.YEARMONTH,df.CLIENTCODE)
Out[196]: 
CLIENTCODE  1  2  3
YEARMONTH          
201301      2  1  0
201302      1  2  1

Sau một chút sửa đổi, mang lại kết quả

pd.crosstab(df.YEARMONTH,df.CLIENTCODE).ne(0).sum(1)
Out[197]: 
YEARMONTH
201301    2
201302    3
dtype: int64

Làm thế nào tôi có thể xuất cái này thành hai cột YEARMONTHcount. Ngoài ra tôi có thể thiết lập số lượng theo thứ tự giảm dần?
Murtaza Haji

3

Tôi cũng đang sử dụng nuniquenhưng nó sẽ rất hữu ích nếu bạn phải sử dụng hàm tổng hợp như 'min', 'max', 'count' or 'mean'v.v.

df.groupby('YEARMONTH')['CLIENTCODE'].transform('nunique') #count(distinct)
df.groupby('YEARMONTH')['CLIENTCODE'].transform('min')     #min
df.groupby('YEARMONTH')['CLIENTCODE'].transform('max')     #max
df.groupby('YEARMONTH')['CLIENTCODE'].transform('mean')    #average
df.groupby('YEARMONTH')['CLIENTCODE'].transform('count')   #count

0

Với phiên bản gấu trúc mới, thật dễ dàng để có được dưới dạng dataframe

unique_count = pd.groupby(['YEARMONTH'], as_index=False).agg(uniq_CLIENTCODE =('CLIENTCODE',pd.Series.count))

0

Đây là một cách tiếp cận để đếm khác biệt trên nhiều cột. Chúng ta hãy có một số dữ liệu:

data = {'CLIENT_CODE':[1,1,2,1,2,2,3],
        'YEAR_MONTH':[201301,201301,201301,201302,201302,201302,201302],
        'PRODUCT_CODE': [100,150,220,400,50,80,100]
       }
table = pd.DataFrame(data)
table

CLIENT_CODE YEAR_MONTH  PRODUCT_CODE
0   1       201301      100
1   1       201301      150
2   2       201301      220
3   1       201302      400
4   2       201302      50
5   2       201302      80
6   3       201302      100

Bây giờ, hãy liệt kê các cột quan tâm và sử dụng nhóm theo cú pháp được sửa đổi một chút:

columns = ['YEAR_MONTH', 'PRODUCT_CODE']
table[columns].groupby(table['CLIENT_CODE']).nunique()

Chúng tôi đạt được:

YEAR_MONTH  PRODUCT_CODE CLIENT_CODE        
1           2            3
2           2            3
3           1            1

0

Phân biệt cột cùng với tập hợp trên các cột khác

Để có được số lượng giá trị riêng biệt cho bất kỳ cột nào ( CLIENTCODEtrong trường hợp của bạn), chúng tôi có thể sử dụng nunique. Chúng ta có thể chuyển đầu vào dưới dạng từ điển trong aggchức năng, cùng với các tập hợp trên các cột khác:

grp_df = df.groupby('YEARMONTH').agg({'CLIENTCODE': ['nunique'],
                                      'other_col_1': ['sum', 'count']})

# to flatten the multi-level columns
grp_df.columns = ["_".join(col).strip() for col in grp_df.columns.values]

# if you wish to reset the index
grp_df.reset_index(inplace=True)
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.