Підрахунок унікальних значень у стовпці у фреймі даних pandas, як у Qlik?


100

Якщо у мене є така таблиця:

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']
})

Я можу зробити count(distinct hID)в Qlik, щоб придумати рахунок 5 для унікального hID. Як це зробити в python, використовуючи фрейм даних pandas? А може, масив numpy? Подібним чином, якщо б count(hID)я це зробив, я отримаю 8 у Qlik. Який еквівалентний спосіб зробити це в пандах?


@piRSquared дякую. Я міг зробити щось на зразок df [['dID', 'hID']]. Agg (['count', 'size', 'nunique']), і це працює. Але це не працює в поєднанні з groupby. Тож df [['dID', 'hID']]. Groupby ('mID'). Agg (['count', 'size', 'nunique']) говорить KeyError. чи є спосіб вибрати конкретні стовпці та застосувати умову?
Alhpa Delta

Три шляхи df[['mID', 'dID','hID']].groupby('mID').agg(['count', 'size', 'nunique'])
piRSквадрат

Абоdf[['dID','hID']].groupby(df['mID']).agg(['count', 'size', 'nunique'])
piRS в квадраті

1
Абоdf.groupby('mID')[['dID', 'hID']].agg(['count', 'size', 'nunique'])
piRS в квадраті

Відповіді:


183

Підрахуйте різні значення, використовуйте nunique:

df['hID'].nunique()
5

Підраховуйте лише ненульові значення, використовуйте count:

df['hID'].count()
8

Підрахуйте загальні значення, включаючи нульові значення, використовуйте sizeатрибут:

df['hID'].size
8

Змінити, щоб додати умову

Використовуйте булеве індексування:

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

АБО за допомогою query:

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

Вихід:

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

Дякую! Як ми додаємо умову? Як nunique для mID = 'A'?
Alhpa Delta

66

Якщо я вважаю, що дані - це ім'я вашого фрейму даних, ви можете зробити:

data['race'].value_counts()

це покаже вам чіткий елемент та їх кількість.


Якщо ви хочете пропорції для кожного унікального предмета, ви також можете зробити. data['race'].value_counts(normalize=True)
фіктивний

24

Або отримайте кількість унікальних значень для кожного стовпця:

df.nunique()

dID    3
hID    5
mID    3
uID    5
dtype: int64

Нове у 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

Ви завжди були в змозі зробити в aggмежах groupby. Я використовував stackнаприкінці, тому що мені більше подобається презентація.

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

Дякую! Як ми додаємо умову? Як nunique для mID = 'A'?
Alhpa Delta

@AlhpaDelta Я додав щось наприкінці. Сподіваюся, що допомагає
piRSквадрат


0

Для підрахунку унікальних значень у стовпці, скажімо, hIDкадру даних df, використовуйте:

len(df.hID.unique())

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.