Menghitung nilai unik di kolom dalam bingkai data panda seperti di Qlik?

100

Jika saya memiliki meja seperti ini:

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

Saya dapat melakukannya count(distinct hID)di Qlik untuk mendapatkan hitungan 5 untuk hID unik. Bagaimana cara melakukannya dengan python menggunakan pandas dataframe? Atau mungkin array yang numpy? Demikian pula jika count(hID)saya melakukannya saya akan mendapatkan 8 di Qlik. Apa cara yang setara untuk melakukannya pada panda?

Delta Alhpa
sumber
@piRR, terima kasih. Saya bisa melakukan sesuatu seperti df [['dID', 'hID']]. Agg (['count', 'size', 'nunique']) dan berhasil. Namun tidak berhasil jika digabungkan dengan groupby. Jadi df [['dID', 'hID']]. Groupby ('mID'). Agg (['count', 'size', 'nunique']) mengatakan KeyError. adakah cara untuk memilih kolom tertentu dan menerapkan kondisi?
Alhpa Delta
Tiga cara df[['mID', 'dID','hID']].groupby('mID').agg(['count', 'size', 'nunique'])
piRSquared
Ataudf[['dID','hID']].groupby(df['mID']).agg(['count', 'size', 'nunique'])
piRSquared
1
Ataudf.groupby('mID')[['dID', 'hID']].agg(['count', 'size', 'nunique'])
piRSquared

Jawaban:

182

Hitung nilai yang berbeda, gunakan nunique:

df['hID'].nunique()
5

Hitung hanya nilai bukan nol, gunakan count:

df['hID'].count()
8

Hitung nilai total termasuk nilai nol, gunakan sizeatribut:

df['hID'].size
8

Edit untuk menambahkan kondisi

Gunakan pengindeksan boolean:

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

ATAU menggunakan query:

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

Keluaran:

nunique    5
count      5
size       5
Name: hID, dtype: int64
Scott Boston
sumber
Terima kasih! Bagaimana cara menambahkan kondisi? Suka nunique untuk mID = 'A'?
Alhpa Delta
66

Jika saya menganggap data adalah nama dataframe Anda, Anda dapat melakukan:

data['race'].value_counts()

ini akan menunjukkan kepada Anda elemen yang berbeda dan jumlah kemunculannya.

oumar
sumber
Jika Anda menginginkan proporsi untuk setiap item unik, Anda juga dapat melakukannya. data['race'].value_counts(normalize=True)
palsu
24

Atau dapatkan jumlah nilai unik untuk setiap kolom:

df.nunique()

dID    3
hID    5
mID    3
uID    5
dtype: int64

Baru di 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

Anda selalu bisa melakukan aggdalam a groupby. Saya menggunakan stackdi bagian akhir karena saya lebih menyukai presentasi tersebut.

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
sumber
Terima kasih! Bagaimana cara menambahkan kondisi? Suka nunique untuk mID = 'A'?
Alhpa Delta
@AlhpaDelta Saya menambahkan sesuatu di akhir. Harapan yang membantu
piRSquared
2

Anda bisa menggunakannya nuniquedi panda:

df.hID.nunique()
# 5
Psidom
sumber
0

Untuk menghitung nilai unik dalam kolom, misalnya hIDdataframe df, gunakan:

len(df.hID.unique())
Uma Raj
sumber
-3

Anda dapat menggunakan properti unik dengan menggunakan fungsi len

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

Manu Siddhartha
sumber