ฉันจะรับจำนวนแถวของ DataFrame แพนด้าได้อย่างไร


931

ฉันพยายามรับจำนวนแถวของ dataframe df ด้วย Pandas และนี่คือรหัสของฉัน

วิธีที่ 1:

total_rows = df.count
print total_rows +1

วิธีที่ 2:

total_rows = df['First_columnn_label'].count
print total_rows +1

ตัวอย่างโค้ดทั้งสองให้ข้อผิดพลาดนี้กับฉัน:

TypeError: ประเภทของตัวถูกดำเนินการที่ไม่รองรับสำหรับ +: 'อินสแตนซ์เมธอด' และ 'int'

ผมทำอะไรผิดหรือเปล่า?


12
ตกลงฉันพบฉันควรได้เรียกวิธีการไม่ตรวจสอบคุณสมบัติดังนั้นจึงควรเป็น df.count () ไม่มี df.count
yemu

56
^ อันตราย! ระวังว่าdf.count()จะส่งคืนจำนวนแถวที่ไม่ใช่ NA / NaN สำหรับแต่ละคอลัมน์เท่านั้น คุณควรใช้df.shape[0]แทนซึ่งจะบอกจำนวนแถวให้ถูกต้องเสมอ
smci

3
โปรดทราบว่า df.count จะไม่ส่งคืน int เมื่อ dataframe ว่างเปล่า (เช่น pd.DataFrame (คอลัมน์ = ["Blue", "Red")) นับเป็น 0 ไม่ได้
Marcelo Bielsa

คำตอบ:


1249

คุณสามารถใช้คุณสมบัติหรือเพียงแค่.shape len(DataFrame.index)อย่างไรก็ตามมีความแตกต่างด้านประสิทธิภาพที่โดดเด่น ( len(DataFrame.index)เร็วที่สุด):

In [1]: import numpy as np

In [2]: import pandas as pd

In [3]: df = pd.DataFrame(np.arange(12).reshape(4,3))

In [4]: df
Out[4]: 
   0  1  2
0  0  1  2
1  3  4  5
2  6  7  8
3  9  10 11

In [5]: df.shape
Out[5]: (4, 3)

In [6]: timeit df.shape
2.77 µs ± 644 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [7]: timeit df[0].count()
348 µs ± 1.31 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [8]: len(df.index)
Out[8]: 4

In [9]: timeit len(df.index)
990 ns ± 4.97 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

ป้อนคำอธิบายรูปภาพที่นี่

แก้ไข: ตามที่ @Dan Allen ระบุไว้ในความคิดเห็นlen(df.index)และdf[0].count()ไม่สามารถใช้แทนกันได้countยกเว้นการรวมNaNของ


13
มีเหตุผลหนึ่งที่ดีว่าทำไมต้องใช้shapeในการทำงานแบบโต้ตอบแทน len (df): ลองใช้ตัวกรองที่แตกต่างกันฉันมักจะต้องรู้ว่ามีกี่รายการที่เหลืออยู่ ด้วยรูปร่างฉันสามารถเห็นได้ว่าเพียงแค่เพิ่ม. shape หลังจากการกรองของฉัน ด้วย len () การแก้ไขบรรทัดคำสั่งจะยุ่งยากมากขึ้นเรื่อย ๆ การกลับไปกลับมา
K. -Michael Aye

9
จะไม่ทำงานกับ OP แต่ถ้าคุณเพียงแค่ต้องรู้ว่า dataframe ว่างเปล่าdf.emptyเป็นตัวเลือกที่ดีที่สุด
jtschoonhoven

19
ฉันรู้ว่ามันใช้เวลานานแล้ว แต่ไม่ใช่ len (df.index) ใช้เวลา 381 nanoseconds หรือ 0.381 microseconds df.shape ช้าลง 3 เท่าใช้เวลา 1.17 microseconds ฉันพลาดอะไรไปหรือเปล่า @root
TG

11
(3,3) เมทริกซ์เป็นตัวอย่างที่ไม่ดีเนื่องจากไม่แสดงคำสั่งของ tuple รูปร่าง
xaedes

4
เป็นวิธีการที่df.shape[0]เร็วกว่าlen(df)หรือlen(df.columns)? ตั้งแต่1 ns (nanosecond) = 1,000 (s (microsecond) ดังนั้น 1.17µs = 1170ns ซึ่งหมายความว่ามันช้าลงกว่า 381ns ประมาณ 3 เท่า
thejef

303

สมมติว่าdfเป็นชื่อไฟล์ของคุณแล้ว:

count_row = df.shape[0]  # gives number of row count
count_col = df.shape[1]  # gives number of col count

หรือยิ่งรัดกุม

r, c = df.shape

4
หากชุดข้อมูลมีขนาดใหญ่ len (df.index) จะเร็วกว่า df.shape [0] หากคุณต้องการเฉพาะการนับแถว ฉันทดสอบมัน
สุมิตร Pokhrel

145

len(df)ใช้ สิ่งนี้ใช้งานได้เหมือนแพนด้า 0.11 หรืออาจเร็วกว่านี้

__len__()อยู่ในขณะนี้ (0.12) Returns length of indexเอกสารที่มี ข้อมูลเวลาตั้งค่าแบบเดียวกับในคำตอบของรูท:

In [7]: timeit len(df.index)
1000000 loops, best of 3: 248 ns per loop

In [8]: timeit len(df)
1000000 loops, best of 3: 573 ns per loop

เนื่องจากการเรียกใช้ฟังก์ชันเพิ่มเติมหนึ่งรายการนั้นจะช้ากว่าการโทรlen(df.index)โดยตรงเล็กน้อย แต่สิ่งนี้ไม่ควรมีบทบาทใด ๆ ในกรณีที่ใช้งานส่วนใหญ่


81

ฉันจะรับจำนวนแถวของ DataFrame แพนด้าได้อย่างไร

ตารางนี้จะสรุปสถานการณ์ต่าง ๆ ที่คุณต้องการนับบางสิ่งใน DataFrame (หรือซีรีย์เพื่อความสมบูรณ์) พร้อมกับวิธีการที่แนะนำ

ป้อนคำอธิบายรูปภาพที่นี่

เชิงอรรถ

  1. DataFrame.countส่งคืนการนับสำหรับแต่ละคอลัมน์เนื่องจากการSeriesนับที่ไม่เป็นนัลแตกต่างกันไปตามคอลัมน์
  2. DataFrameGroupBy.sizeส่งคืน a Seriesเนื่องจากคอลัมน์ทั้งหมดในกลุ่มเดียวกันแบ่งปันจำนวนแถวเท่ากัน
  3. 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

ในทำนองเดียวกันสำหรับคุณจะต้องใช้SeriesSeriesGroupBy.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ผลตอบแทนถ้าเรียกว่าในคอลัมน์ที่เฉพาะเจาะจงหรืออื่นSeriesDataFrame

วิธีการต่อไปนี้กลับมาเหมือนกัน:

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

เรียกว่าคอลัมน์ที่เฉพาะเจาะจง


35

TL; DR

ใช้ len(df)


len()len(df)เป็นเพื่อนของคุณก็สามารถนำมาใช้สำหรับการนับแถวเป็น

หรือคุณสามารถเข้าถึงแถวทั้งหมดโดยdf.indexและคอลัมน์ทั้งหมดโดย df.columnsและในขณะที่คุณสามารถใช้len(anyList)เพื่อรับจำนวนรายการใช้ len(df.index)สำหรับรับจำนวนแถวและlen(df.columns)จำนวนคอลัมน์

หรือคุณสามารถใช้df.shapeซึ่งจะส่งกลับจำนวนแถวและคอลัมน์ด้วยกันถ้าคุณต้องการที่จะเข้าถึงจำนวนแถวที่ใช้เฉพาะและจำนวนคอลัมน์เพียงใช้:df.shape[0]df.shape[1]


19

นอกเหนือจากคำตอบข้างต้นใช้สามารถใช้df.axesเพื่อรับ tuple กับดัชนีแถวและคอลัมน์จากนั้นใช้len()ฟังก์ชั่น:

total_rows=len(df.axes[0])
total_cols=len(df.axes[1])

2
สิ่งนี้จะคืนค่าวัตถุดัชนีซึ่งอาจเป็นสำเนาของต้นฉบับซึ่งอาจสิ้นเปลืองหากคุณทิ้งไปหลังจากตรวจสอบความยาว ถ้าคุณตั้งใจจะทำอะไรอย่างอื่นที่มีค่าดัชนีที่ไม่ได้ใช้
cs95

9

... สร้างคำตอบของ Jan-Philip Gehrcke

เหตุผลว่าทำไมlen(df)หรือจะเร็วกว่าlen(df.index) df.shape[0]ดูรหัส df.shape เป็น@propertyวิธีที่เรียกใช้วิธี DataFrame การเรียกlenสองครั้ง

df.shape??
Type:        property
String form: <property object at 0x1127b33c0>
Source:     
# df.shape.fget
@property
def shape(self):
    """
    Return a tuple representing the dimensionality of the DataFrame.
    """
    return len(self.index), len(self.columns)

และใต้ฝากระโปรงของ len (df)

df.__len__??
Signature: df.__len__()
Source:   
    def __len__(self):
        """Returns length of info axis, but here we use the index """
        return len(self.index)
File:      ~/miniconda2/lib/python2.7/site-packages/pandas/core/frame.py
Type:      instancemethod

len(df.index)จะเร็วกว่าเล็กน้อยlen(df)เนื่องจากมีการเรียกใช้ฟังก์ชันน้อยลงหนึ่งครั้ง แต่จะเร็วกว่าเสมอdf.shape[0]


7

ฉันมาที่แพนด้าจากRพื้นหลังและฉันเห็นว่าหมีแพนด้านั้นซับซ้อนกว่าเมื่อต้องเลือกแถวหรือคอลัมน์ ฉันต้องต่อสู้กับมันชั่วขณะหนึ่งจากนั้นฉันก็พบวิธีจัดการกับ:

รับจำนวนคอลัมน์:

len(df.columns)  
## Here:
#df is your data.frame
#df.columns return a string, it contains column's titles of the df. 
#Then, "len()" gets the length of it.

รับจำนวนแถว:

len(df.index) #It's similar.

หลังจากที่ใช้นุ่นdf.shapeในขณะที่ผมคิดว่าเราควรจะไปด้วย มันจะคืนค่าจำนวนแถวและคอลัมน์ตามลำดับ
Catbuilts

4

ในกรณีที่คุณต้องการให้จำนวนแถวอยู่ตรงกลางของการดำเนินการที่ถูกโยงคุณสามารถใช้:

df.pipe(len)

ตัวอย่าง:

row_count = (
      pd.DataFrame(np.random.rand(3,4))
      .reset_index()
      .pipe(len)
)

สิ่งนี้มีประโยชน์หากคุณไม่ต้องการใส่คำสั่งยาว ๆ เข้าไปในlen()ฟังก์ชั่น

คุณสามารถใช้__len__()แทน แต่__len__()ดูแปลก ๆ


ดูเหมือนว่าไม่มีประโยชน์ที่จะต้องการ "ไพพ์" การดำเนินการนี้เพราะไม่มีสิ่งอื่นใดที่คุณสามารถไพพ์ลงในนี้ได้ (มันจะคืนค่าจำนวนเต็ม) ผมจะค่อนข้างมากกว่าcount = len(df.reset_index()) count = df.reset_index().pipe(len)อดีตเป็นเพียงการค้นหาคุณลักษณะโดยไม่มีการเรียกใช้ฟังก์ชัน
cs95

1

เฮ้คุณสามารถใช้ทำสิ่งนี้ด้วย:

สมมติว่าdfเป็น dataframe ของคุณ จากนั้นdf.shapeให้รูปร่างของ dataframe ของคุณเช่น(row,col)

ดังนั้นให้กำหนดคำสั่งด้านล่างเพื่อให้ได้สิ่งที่ต้องการ

 row = df.shape[0], col = df.shape[1]

0

สำหรับ dataframe df จำนวนแถวที่จัดรูปแบบด้วยเครื่องหมายจุลภาคที่พิมพ์จะถูกใช้ในขณะที่สำรวจข้อมูล:

def nrow(df):
    print("{:,}".format(df.shape[0]))

ตัวอย่าง:

nrow(my_df)
12,456,789

0

วิธีทางเลือกในการค้นหาจำนวนแถวในดาต้าเฟรมที่ฉันคิดว่าเป็นตัวแปรที่อ่านได้มากที่สุดคือ pandas.Index.sizeซึ่งผมคิดว่าเป็นตัวแปรที่สามารถอ่านได้มากที่สุดคือ

โปรดทราบว่าเมื่อฉันแสดงความคิดเห็นในคำตอบที่ยอมรับ:

สงสัยว่าpandas.Index.sizeจริง ๆ แล้วจะเร็วกว่าlen(df.index)แต่timeitในคอมพิวเตอร์ของฉันจะบอกฉันเป็นอย่างอื่น (~ 150 ns ช้าลงต่อการวนซ้ำ)


0

ฉันไม่แน่ใจว่าจะใช้งานได้หรือไม่ (ไม่สามารถใส่ข้อมูลได้) แต่อาจใช้งานได้:

*dataframe name*.tails(1)

จากนั้นเมื่อใช้สิ่งนี้คุณจะสามารถค้นหาจำนวนแถวโดยเรียกใช้ข้อมูลโค้ดและดูหมายเลขแถวที่คุณได้รับ


-2

สิ่งใดสิ่งหนึ่งสามารถทำได้ ( dfเป็นชื่อของ DataFrame):

วิธีที่ 1: การใช้lenฟังก์ชั่น:

len(df)จะทำให้จำนวนแถวใน DataFrame dfที่ชื่อว่า

วิธีที่ 2: ใช้countฟังก์ชั่น:

df[col].count()colจะนับจำนวนแถวในคอลัมน์ที่กำหนด

df.count() จะให้จำนวนแถวสำหรับคอลัมน์ทั้งหมด


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