ฉันจะรับจำนวนแถวของ DataFrame แพนด้าได้อย่างไร
ตารางนี้จะสรุปสถานการณ์ต่าง ๆ ที่คุณต้องการนับบางสิ่งใน DataFrame (หรือซีรีย์เพื่อความสมบูรณ์) พร้อมกับวิธีการที่แนะนำ
เชิงอรรถ
DataFrame.count
ส่งคืนการนับสำหรับแต่ละคอลัมน์เนื่องจากการSeries
นับที่ไม่เป็นนัลแตกต่างกันไปตามคอลัมน์
DataFrameGroupBy.size
ส่งคืน a Series
เนื่องจากคอลัมน์ทั้งหมดในกลุ่มเดียวกันแบ่งปันจำนวนแถวเท่ากัน
DataFrameGroupBy.count
ส่งคืน a DataFrame
เนื่องจากการนับที่ไม่ใช่ค่า null อาจแตกต่างกันในแต่ละคอลัมน์ในกลุ่มเดียวกัน ในการรับจำนวนกลุ่มที่ไม่เป็นโมฆะสำหรับคอลัมน์หนึ่งให้ใช้โดยdf.groupby(...)['x'].count()
ที่ "x" คือคอลัมน์ที่จะนับ
ตัวอย่างรหัสขั้นต่ำ
ด้านล่างนี้ฉันแสดงตัวอย่างของแต่ละวิธีที่อธิบายไว้ในตารางด้านบน ก่อนการตั้งค่า -
df = pd.DataFrame({
'A': list('aabbc'), 'B': ['x', 'x', np.nan, 'x', np.nan]})
s = df['B'].copy()
df
A B
0 a x
1 a x
2 b NaN
3 b x
4 c NaN
s
0 x
1 x
2 NaN
3 x
4 NaN
Name: B, dtype: object
จำนวนแถวของ DataFrame A: len(df)
, df.shape[0]
หรือlen(df.index)
len(df)
# 5
df.shape[0]
# 5
len(df.index)
# 5
ดูเหมือนว่าโง่ที่จะเปรียบเทียบประสิทธิภาพของการดำเนินการเวลาคงที่โดยเฉพาะอย่างยิ่งเมื่อความแตกต่างอยู่ในระดับ "จริงจังไม่ต้องกังวลกับมัน" แต่นี่ดูเหมือนจะเป็นแนวโน้มของคำตอบอื่น ๆ ดังนั้นฉันจึงทำแบบเดียวกันเพื่อความสมบูรณ์
จาก 3 วิธีข้างต้นlen(df.index)
(ดังที่กล่าวไว้ในคำตอบอื่น ๆ ) เป็นวิธีที่เร็วที่สุด
บันทึก
- วิธีการทั้งหมดข้างต้นเป็นการดำเนินการเวลาคงที่เนื่องจากเป็นการค้นหาแอตทริบิวต์อย่างง่าย
df.shape
(เพื่อที่คล้ายกันndarray.shape
) เป็นคุณลักษณะที่ผลตอบแทน tuple (# Rows, # Cols)
ของ ตัวอย่างเช่นdf.shape
ส่งคืน(8,
2)
ตัวอย่างที่นี่
คอลัมน์จำนวน DataFrame A: df.shape[1]
,len(df.columns)
df.shape[1]
# 2
len(df.columns)
# 2
คล้ายคลึงกับlen(df.index)
, len(df.columns)
เป็นวิธีที่เร็วกว่าของทั้งสองวิธี (แต่ใช้ตัวอักษรมากขึ้นในการพิมพ์)
แถวจำนวนซีรีส์: len(s)
, s.size
,len(s.index)
len(s)
# 5
s.size
# 5
len(s.index)
# 5
s.size
และlen(s.index)
ใกล้เคียงกันในเรื่องของความเร็ว len(df)
แต่ผมขอแนะนำให้
Note
size
เป็นแอททริบิวต์และส่งคืนจำนวนองค์ประกอบ (= จำนวนแถวสำหรับซีรี่ส์ใด ๆ ) DataFrames df.shape[0] * df.shape[1]
ยังกำหนดแอตทริบิวต์ขนาดซึ่งจะส่งกลับผลเช่นเดียวกับ
การนับแถวที่ไม่เป็นศูนย์: DataFrame.count
และSeries.count
วิธีการที่อธิบายไว้ที่นี่จะนับเฉพาะค่าที่ไม่เป็นโมฆะเท่านั้น (หมายถึง NaNs จะถูกละเว้น)
การโทรDataFrame.count
จะส่งกลับจำนวนนับไม่ใช่ NaN สำหรับแต่ละคอลัมน์:
df.count()
A 5
B 3
dtype: int64
สำหรับซีรี่ส์ให้ใช้เอSeries.count
ฟเฟกต์ที่คล้ายกัน:
s.count()
# 3
จำนวนแถวที่ชาญฉลาดกลุ่ม: GroupBy.size
สำหรับDataFrames
ใช้DataFrameGroupBy.size
เพื่อนับจำนวนแถวต่อกลุ่ม
df.groupby('A').size()
A
a 2
b 2
c 1
dtype: int64
ในทำนองเดียวกันสำหรับคุณจะต้องใช้Series
SeriesGroupBy.size
s.groupby(df.A).size()
A
a 2
b 2
c 1
Name: B, dtype: int64
ในทั้งสองกรณี a Series
จะถูกส่งคืน มันสมเหตุสมผลสำหรับDataFrames
เช่นกันเนื่องจากทุกกลุ่มมีการนับแถวร่วมกัน
การนับแถวที่ไม่เป็นนัลแบบกลุ่ม: GroupBy.count
คล้ายกับข้างต้น แต่ใช้งานไม่ได้GroupBy.count
GroupBy.size
โปรดสังเกตว่าsize
มักจะส่งกลับSeries
ในขณะที่count
ผลตอบแทนถ้าเรียกว่าในคอลัมน์ที่เฉพาะเจาะจงหรืออื่นSeries
DataFrame
วิธีการต่อไปนี้กลับมาเหมือนกัน:
df.groupby('A')['B'].size()
df.groupby('A').size()
A
a 2
b 2
c 1
Name: B, dtype: int64
ในขณะเดียวกันสำหรับcount
เรามี
df.groupby('A').count()
B
A
a 2
b 1
c 0
... เรียกใช้บนวัตถุ GroupBy ทั้งหมด, v / s,
df.groupby('A')['B'].count()
A
a 2
b 1
c 0
Name: B, dtype: int64
เรียกว่าคอลัมน์ที่เฉพาะเจาะจง