การนับค่าที่ไม่ซ้ำกันในคอลัมน์ในดาต้าเฟรมแพนด้าเช่นใน 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 โดยใช้แพนด้าดาต้าเฟรมได้อย่างไร หรืออาจจะเป็นอาร์เรย์ที่น่าเบื่อ? ในทำนองเดียวกันถ้าจะทำ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'])
piRSquared

หรือdf[['dID','hID']].groupby(df['mID']).agg(['count', 'size', 'nunique'])
piRSquared

1
หรือdf.groupby('mID')[['dID', 'hID']].agg(['count', 'size', 'nunique'])
piRSquared

คำตอบ:


180

นับค่าที่ไม่ซ้ำnuniqueกันใช้:

df['hID'].nunique()
5

นับเฉพาะค่าที่ไม่ใช่ค่าว่างให้ใช้count:

df['hID'].count()
8

นับค่าทั้งหมดรวมทั้งค่า null ใช้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 ฉันเพิ่มบางอย่างในตอนท้าย หวังว่าจะช่วยได้นะ
piRSquared



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.