Đếm các giá trị duy nhất trong một cột trong khung dữ liệu gấu trúc như trong Qlik?


100

Nếu tôi có một bảng như thế này:

df = pd.DataFrame({
         'hID': [101, 102, 103, 101, 102, 104, 105, 101],
         'dID': [10, 11, 12, 10, 11, 10, 12, 10],
         'uID': ['James', 'Henry', 'Abe', 'James', 'Henry', 'Brian', 'Claude', 'James'],
         'mID': ['A', 'B', 'A', 'B', 'A', 'A', 'A', 'C']
})

Tôi có thể làm count(distinct hID)trong Qlik để đưa ra số đếm là 5 cho hID duy nhất. Làm cách nào để thực hiện điều đó trong python bằng khung dữ liệu gấu trúc? Hoặc có thể là một mảng numpy? Tương tự, nếu phải làm, count(hID)tôi sẽ nhận được 8 trong Qlik. Cách tương đương để làm điều đó ở gấu trúc là gì?


@piRSquared cảm ơn. Tôi có thể làm một cái gì đó như df [['dID', 'hID']]. Agg (['count', 'size', 'nunique']) và nó hoạt động. Nhưng nó không hoạt động khi kết hợp với groupby. Vì vậy, df [['dID', 'hID']]. Groupby ('mID'). Agg (['count', 'size', 'nunique']) nói KeyError. có cách nào để chọn các cột cụ thể và áp dụng một điều kiện không?
Alhpa Delta

Three df[['mID', 'dID','hID']].groupby('mID').agg(['count', 'size', 'nunique'])
way

Hoặcdf[['dID','hID']].groupby(df['mID']).agg(['count', 'size', 'nunique'])
piRSquared

1
Hoặcdf.groupby('mID')[['dID', 'hID']].agg(['count', 'size', 'nunique'])
piRSquared

Câu trả lời:


183

Đếm các giá trị riêng biệt, sử dụng nunique:

df['hID'].nunique()
5

Chỉ đếm các giá trị không rỗng, sử dụng count:

df['hID'].count()
8

Đếm tổng giá trị bao gồm cả giá trị rỗng, sử dụng sizethuộc tính:

df['hID'].size
8

Chỉnh sửa để thêm điều kiện

Sử dụng lập chỉ mục boolean:

df.loc[df['mID']=='A','hID'].agg(['nunique','count','size'])

HOẶC sử dụng query:

df.query('mID == "A"')['hID'].agg(['nunique','count','size'])

Đầu ra:

nunique    5
count      5
size       5
Name: hID, dtype: int64

Cảm ơn! Làm thế nào để chúng tôi thêm một điều kiện? Giống như nunique cho mID = 'A'?
Alhpa Delta

66

Nếu tôi giả sử dữ liệu là tên của khung dữ liệu của bạn, bạn có thể làm:

data['race'].value_counts()

điều này sẽ cho bạn thấy yếu tố riêng biệt và số lần xuất hiện của chúng.


Nếu bạn muốn tỷ lệ cho mỗi mục duy nhất, bạn cũng có thể làm. data['race'].value_counts(normalize=True)
bogus

24

Hoặc nhận số lượng giá trị duy nhất cho mỗi cột:

df.nunique()

dID    3
hID    5
mID    3
uID    5
dtype: int64

Mới pandas 0.20.0 pd.DataFrame.agg

df.agg(['count', 'size', 'nunique'])

         dID  hID  mID  uID
count      8    8    8    8
size       8    8    8    8
nunique    3    5    3    5

Bạn luôn có thể làm một aggtrong một groupby. Tôi đã sử dụng stackở phần cuối vì tôi thích cách trình bày hơn.

df.groupby('mID').agg(['count', 'size', 'nunique']).stack()


             dID  hID  uID
mID                       
A   count      5    5    5
    size       5    5    5
    nunique    3    5    5
B   count      2    2    2
    size       2    2    2
    nunique    2    2    2
C   count      1    1    1
    size       1    1    1
    nunique    1    1    1

Cảm ơn! Làm thế nào để chúng tôi thêm một điều kiện? Giống như nunique cho mID = 'A'?
Alhpa Delta

@AlhpaDelta Tôi đã thêm một số thứ vào cuối. Hy vọng điều đó sẽ hữu ích
piRSquared


0

Để đếm các giá trị duy nhất trong cột, chẳng hạn hIDnhư khung dữ liệu df, hãy sử dụng:

len(df.hID.unique())

-3

bạn có thể sử dụng thuộc tính duy nhất bằng cách sử dụng hàm len

len (df ['hID']. unique ()) 5

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.