Zliczanie unikalnych wartości w kolumnie w ramce danych pandy, jak w Qlik?

106

Jeśli mam taki stół:

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

Mogę count(distinct hID)w Qlik wymyślić liczbę 5 dla unikalnego HID. Jak to zrobić w Pythonie przy użyciu ramki danych pandy? A może tablica numpy? Podobnie, jeśli count(hID)miałbym to zrobić , to dostanę 8 w Qlik. Jaki jest równoważny sposób, aby to zrobić w pandach?

Alhpa Delta
źródło
@piRSquared thanks. Mógłbym zrobić coś takiego jak df [['dID', 'hID']]. Agg (['count', 'size', 'nunique']) i to działa. Ale nie działa w połączeniu z trybem grupowym. Zatem df [['dID', 'hID']]. Groupby ('mID'). Agg (['count', 'size', 'nunique']) mówi KeyError. czy istnieje sposób na wybranie określonych kolumn i zastosowanie warunku?
Alhpa Delta
Trzy sposoby df[['mID', 'dID','hID']].groupby('mID').agg(['count', 'size', 'nunique'])
piRSquared
Lubdf[['dID','hID']].groupby(df['mID']).agg(['count', 'size', 'nunique'])
piRSquared
1
Lubdf.groupby('mID')[['dID', 'hID']].agg(['count', 'size', 'nunique'])
piRSquared

Odpowiedzi:

193

Policz różne wartości, użyj nunique:

df['hID'].nunique()
5

Policz tylko wartości inne niż null, użyj count:

df['hID'].count()
8

Policz łączne wartości, w tym wartości null, użyj sizeatrybutu:

df['hID'].size
8

Edytuj, aby dodać warunek

Użyj indeksowania logicznego:

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

LUB używając query:

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

Wynik:

nunique    5
count      5
size       5
Name: hID, dtype: int64
Scott Boston
źródło
Dzięki! Jak dodajemy warunek? Jak nunique dla mID = 'A'?
Alhpa Delta
74

Jeśli przyjmuję, że dane to nazwa Twojej ramki danych, możesz:

data['race'].value_counts()

pokaże ci to odrębny element i liczbę ich wystąpień.

oumar
źródło
Jeśli chcesz proporcje dla każdego unikalnego przedmiotu, możesz również to zrobić. data['race'].value_counts(normalize=True)
fałszywe
25

Lub uzyskaj liczbę unikalnych wartości dla każdej kolumny:

df.nunique()

dID    3
hID    5
mID    3
uID    5
dtype: int64

Nowy w 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

Zawsze byłeś w stanie zrobić aggw groupby. Skorzystałem stackna końcu, bo prezentacja mi się bardziej podoba.

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
piRSquared
źródło
Dzięki! Jak dodajemy warunek? Jak nunique dla mID = 'A'?
Alhpa Delta
@AlhpaDelta Dodałem coś na koniec. Mam nadzieję, że to pomoże
piRSquared
2

Możesz użyć nuniquew pandach:

df.hID.nunique()
# 5
Psidom
źródło
0

Aby policzyć unikalne wartości w kolumnie, powiedzmy hIDw ramce danych df, użyj:

len(df.hID.unique())
Uma Raj
źródło
-3

możesz użyć unikalnej właściwości za pomocą funkcji len

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

Manu Siddhartha
źródło