如何获取pandas DataFrame的行数?

时间:2013-04-11 08:14:08

标签: python pandas dataframe

我正在尝试使用Pandas获取dataframe df的行数,这是我的代码。

方法1:

total_rows = df.count
print total_rows +1

方法2:

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

这两段代码片段都给了我这个错误:

  

TypeError:+:'instancemethod'和'int'

不支持的操作数类型

我做错了什么?

18 个答案:

答案 0 :(得分:863)

您可以使用.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)

enter image description here

编辑:正如@Dan Allen在评论len(df.index)df[0].count()中所指出的那样不可互换,因为count排除NaN s,

答案 1 :(得分:197)

假设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

答案 2 :(得分:110)

使用len(df)。这适用于pandas 0.11或甚至更早。

__len__()目前(0.12)记录了Returns length of index。时间信息,设置方式与root的答案相同:

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)慢一点,但这在大多数用例中不起任何作用。

答案 3 :(得分:21)

len() 是您的朋友,行数的简短回答为len(df)

或者,您可以按df.index和所有列访问所有行 df.columns,因为您可以使用 len(anyList) 来获取列表计数,因此您可以使用 len(df.index)用于获取行数,len(df.columns)用于列数。

或者,您可以使用df.shape一起返回行数和列数,如果要访问行数仅使用df.shape[0],并且列数仅使用:{{ 1}}。

答案 4 :(得分:16)

除了上述答案之外,use可以使用df.axes来获取包含行索引和列索引的元组,然后使用len()函数:

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

答案 5 :(得分:15)

  

如何获取熊猫DataFrame的行数?

此表总结了您希望在DataFrame(或出于完整性考虑而选择Series)中进行计数的不同情况,以及推荐的方法。

enter image description here

  

脚注

     
      
  1. DataFrame.countSeries的形式返回每一列的计数,因为非空计数随列而变化。
  2.   
  3. DataFrameGroupBy.size返回一个Series,因为同一组中的所有列共享相同的行数。
  4.   
  5. DataFrameGroupBy.count返回一个DataFrame,因为同一组中各列的非空计数可能不同。要获取特定列的分组非空计数,请使用df.groupby(...)['x'].count(),其中“ x”是要计数的列。
  6.   

最小代码示例

下面,我显示上表中描述的每种方法的示例。首先,设置-

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

数据帧的行数: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)是一个返回(# Rows, # Cols)元组的属性。例如,对于此处的示例,df.shape返回(8, 2)
  •   

数据帧的列数:df.shape[1]len(df.columns)

df.shape[1]
# 2

len(df.columns)
# 2

类似于len(df.index)len(df.columns)是这两种方法中比较快的一种(但是需要输入更多的字符)。

系列的行数:len(s)s.sizelen(s.index)

len(s)
# 5

s.size
# 5

len(s.index)
# 5

s.sizelen(s.index)的速度大致相同。但我推荐len(df)

  

注意
  size是一个属性,它返回元素数(= count   任何系列的行数)。 DataFrames还定义了一个size属性,   返回与df.shape[0] * df.shape[1]相同的结果。

非空行数:DataFrame.countSeries.count

此处描述的方法仅计算非空值(表示忽略NaN)。

调用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

在两种情况下,都返回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

在特定列上调用。

答案 6 :(得分:6)

我从R背景来到pandas,我发现在选择行或列时,大熊猫更复杂。 我不得不与它搏斗一段时间,然后我找到了一些方法来处理:

获取列数:

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.

答案 7 :(得分:6)

嘿,您也可以使用此功能:

假设df是您的数据框。然后df.shape为您提供数据框的形状,即(row,col)

因此,请在下面分配命令以获取所需的

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

答案 8 :(得分:6)

行数(使用任何一个):

df.shape[0]
len(df)

答案 9 :(得分:5)

......以Jan-Philip Gehrcke的回答为基础。

len(df)len(df.index)df.shape[0]快的原因。看看代码。 df.shape是@property,运行两次调用len的DataFrame方法。

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]

答案 10 :(得分:5)

df.shape以元组的形式返回数据框的形状(行数,列数)。

您可以简单地访问否。行或否。分别为df.shape[0]df.shape[1]的cols,与访问元组的值相同。

答案 11 :(得分:2)

如果您想在链接操作的中间获取行计数,可以使用:

df.pipe(len)

示例:

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

如果您不想在len()函数中放置长语句,这可能很有用。

你可以使用__len __()而__len __()看起来有点奇怪。

答案 12 :(得分:2)

这两种方法都可以做到(df是DataFrame的名称):

方法1 :使用len函数:

len(df)将给出名为df的DataFrame中的行数。

方法2 :使用count函数:

df[col].count()将计算给定列col中的行数。

df.count()将给出所有列的行数。

答案 13 :(得分:0)

对于dataframe df,在浏览数据时使用打印的逗号格式行计数:

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

示例:

nrow(my_df)
12,456,789

答案 14 :(得分:0)

找出pandas.Index.size是我认为是最易读的变体,用于找出数据框中的行数的另一种方法。

请注意,正如我对接受的答案所做的评论:

怀疑<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <table> <tr> <td style="width: 50%"> <label for="symbolsize"><b> PCB's symbol size Rows x Columns *</b></label><br><br> <select id="symbolsize" name="symbolsize" style="width: 350px; height: 35px; border-radius: 8px" required /> <option value="" disabled selected> Please Select... </option> <option value="1"> 10 x 10 </option> <option value="2"> 12 x 12</option> <option value="3"> 14 x 14 </option> <option value="4"> 16 x 16</option> <option value="5"> 18 x 18 </option> <option value="6"> 20 x 20</option> <option value="7"> 22 x 22 </option> <option value="8"> 24 x 24 </option> </select><br><br> </td> <td style="width: 50%; display: none" id="codesize1"> <label for="codesize1"><b><span style="color:red">Please enter the size of the code between 1.27mm and 3.81mm *</span> </b></label><br><br> <input type="number" step="any" min="1.27" max="3.81" name="codesize1" style="width: 350px; height: 25px; border-radius: 8px" required /><br><br> </td> <td style="width: 50%; display: none" id="codesize2"> <label for="codesize2"><b><span style="color:red">Please enter the size of the code between 1.52mm and 4.57mm *</span> </b></label><br><br> <input type="number" step="any" min="1.52" max="4.57" name="codesize2" style="width: 350px; height: 25px; border-radius: 8px" required /><br><br> </td> <td style="width: 50%; display: none" id="codesize3"> <label for="codesize3"><b><span style="color:red">Please enter the size of the code between 1.78mm and 5.33mm *</span> </b></label><br><br> <input type="number" step="any" min="1.78" max="5.33" name="codesize3" style="width: 350px; height: 25px; border-radius: 8px" required /><br><br> </td> <td style="width: 50%; display: none" id="codesize4"> <label for="codesize4"><b><span style="color:red">Please enter the size of the code between 2.03mm and 6.1mm *</span> </b></label><br><br> <input type="number" step="any" min="2.03" max="6.1" name="codesize4" style="width: 350px; height: 25px; border-radius: 8px" required /><br><br> </td> <td style="width: 50%; display: none" id="codesize5"> <label for="codesize5"><b><span style="color:red">Please enter the size of the code between 2.29mm and 6.87mm *</span> </b></label><br><br> <input type="number" step="any" min="2.29" max="6.87" name="codesize5" style="width: 350px; height: 25px; border-radius: 8px" required /><br><br> </td> <td style="width: 50%; display: none" id="codesize6"> <label for="codesize6"><b><span style="color:red">Please enter the size of the code between 2.54mm and 7.62mm *</span> </b></label><br><br> <input type="number" step="any" min="2.54" max="7.62" name="codesize6" style="width: 350px; height: 25px; border-radius: 8px" required /><br><br> </td> <td style="width: 50%; display: none" id="codesize7"> <label for="codesize7"><b><span style="color:red">Please enter the size of the code between 2.79mm and 8.38mm *</span> </b></label><br><br> <input type="number" step="any" min="2.79" max="8.38" name="codesize7" style="width: 350px; height: 25px; border-radius: 8px" required /><br><br> </td> <td style="width: 50%; display: none" id="codesize8"> <label for="codesize8"><b><span style="color:red">Please enter the size of the code between 3.05mm and 9.14mm *</span> </b></label><br><br> <input type="number" step="any" min="3.05" max="9.14" name="codesize8" style="width: 350px; height: 25px; border-radius: 8px" required /><br><br> </td> </tr> </table>实际上比pandas.Index.size快,但我计算机上的len(df.index)却告诉我(每个循环慢150 ns)。

答案 15 :(得分:0)

我不确定这是否行得通(可以省略数据),但这可能行得通:

*dataframe name*.tails(1)

然后使用它,您可以通过运行代码段并查看提供给您的行号来找到行数。

答案 16 :(得分:-1)

认为,数据集是“data”,将您的数据集命名为“data_fr”,data_fr 中的行数是“nu_rows”

#import the data frame. Extention could be different as csv,xlsx or etc.
data_fr = pd.read_csv('data.csv')

#print the number of rows
nu_rows = data_fr.shape[0]
print(nu_rows)

答案 17 :(得分:-2)

# this will give you the number of rows in the dataframe df
df.shape[0]