pd.unique
ส่งคืนค่าที่ไม่ซ้ำกันจากอาร์เรย์อินพุตหรือคอลัมน์หรือดัชนี DataFrame
อินพุตของฟังก์ชันนี้ต้องเป็นมิติเดียวดังนั้นจึงต้องรวมหลายคอลัมน์ วิธีที่ง่ายที่สุดคือเลือกคอลัมน์ที่คุณต้องการจากนั้นดูค่าในอาร์เรย์ NumPy แบบแบน การดำเนินการทั้งหมดมีลักษณะดังนี้:
>>> pd.unique(df[['Col1', 'Col2']].values.ravel('K'))
array(['Bob', 'Joe', 'Bill', 'Mary', 'Steve'], dtype=object)
โปรดทราบว่าravel()
เป็นวิธีอาร์เรย์ที่จะส่งกลับมุมมอง (ถ้าเป็นไปได้) ของอาร์เรย์หลายมิติ อาร์กิวเมนต์'K'
จะบอกวิธีการทำให้อาร์เรย์แบนราบตามลำดับที่องค์ประกอบจะถูกเก็บไว้ในหน่วยความจำ (โดยทั่วไปแล้วแพนด้าจะเก็บอาร์เรย์ที่อยู่ภายใต้ลำดับที่ต่อเนื่องกันของ Fortranคอลัมน์ก่อนแถว) ซึ่งอาจเร็วกว่าการใช้คำสั่ง 'C' เริ่มต้นของเมธอดอย่างมาก
อีกวิธีหนึ่งคือเลือกคอลัมน์และส่งต่อไปยังnp.unique
:
>>> np.unique(df[['Col1', 'Col2']].values)
array(['Bill', 'Bob', 'Joe', 'Mary', 'Steve'], dtype=object)
ไม่จำเป็นต้องใช้ravel()
ที่นี่เนื่องจากวิธีการจัดการกับอาร์เรย์หลายมิติ ถึงกระนั้นมันก็น่าจะช้ากว่าpd.unique
เนื่องจากใช้อัลกอริธึมแบบเรียงลำดับแทนที่จะใช้แฮชแท็กเพื่อระบุค่าที่ไม่ซ้ำกัน
ความแตกต่างของความเร็วมีความสำคัญสำหรับ DataFrames ขนาดใหญ่ (โดยเฉพาะอย่างยิ่งหากมีค่าที่ไม่ซ้ำกันเพียงไม่กี่ค่า):
>>> df1 = pd.concat([df]*100000, ignore_index=True) # DataFrame with 500000 rows
>>> %timeit np.unique(df1[['Col1', 'Col2']].values)
1 loop, best of 3: 1.12 s per loop
>>> %timeit pd.unique(df1[['Col1', 'Col2']].values.ravel('K'))
10 loops, best of 3: 38.9 ms per loop
>>> %timeit pd.unique(df1[['Col1', 'Col2']].values.ravel()) # ravel using C order
10 loops, best of 3: 49.9 ms per loop
df1.groupby(['A','B']).size().reset_index().rename(columns={0:'count'})