如何获取Pandas DataFrame的行数?

如何获取熊猫数据框df的行数?

3631753 次浏览

对于dataframedf,可以使用以下任何一种:

  • len(df.index)
  • df.shape[0]
  • df[df.columns[0]].count()(==第一列中的非NaN值的数量

性能图


重现情节的代码:

import numpy as npimport pandas as pdimport perfplot
perfplot.save("out.png",setup=lambda n: pd.DataFrame(np.arange(n * 3).reshape(n, 3)),n_range=[2**k for k in range(25)],kernels=[lambda df: len(df.index),lambda df: df.shape[0],lambda df: df[df.columns[0]].count(),],labels=["len(df.index)", "df.shape[0]", "df[df.columns[0]].count()"],xlabel="Number of rows",)

使用len(df):-)。

__len__()记录为“返回索引长度”。

定时信息,设置方式与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)慢一点当然是正确的。但这在大多数情况下应该无关紧要。我发现len(df)很可读。

除了前面的答案,您可以使用df.axes获取具有行和列索引的元组,然后使用len()函数:

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

假设df是你的数据框:

count_row = df.shape[0]  # Gives number of rowscount_col = df.shape[1]  # Gives number of columns

或者,更简洁地说,

r, c = df.shape

太长别读使用#0

#0返回列表对象(也适用于字典、字符串、元组或范围对象)的项数(长度)。因此,要获取DataFrame的行数,只需使用len(df)。有关len函数的更多信息,请参阅的官方页面


或者,您可以分别使用df.indexdf.columns访问所有行和所有列。由于您可以使用#2来获取元素编号,因此使用len(df.index)将给出行数,len(df.columns)将给出列数。

或者,您可以使用df.shape返回一起的行数和列数(作为元组),您可以使用其索引访问每个项目。如果您想访问行数,请仅使用df.shape[0]。对于列数,请仅使用:df.shape[1]

我从R背景来到Pandas,我看到Pandas在选择行或列时更加复杂。

我不得不与它搏斗了一段时间,然后我找到了一些方法来处理:

获取列数:

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

获取行数:

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

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

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

示例:

nrow(my_df)12,456,789

…建立在Jan-Philip Gehrcke的回答上。

为什么len(df)len(df.index)df.shape[0]快:

df.shape是一个@property,它运行一个DataFrame方法调用len两次。

df.shape??Type:        propertyString form: <property object at 0x1127b33c0>Source:# df.shape.fget@propertydef 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.pyType:      instancemethod

len(df.index)会比len(df)稍微快一点,因为它少了一个函数调用,但这总是比df.shape[0]

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

df.pipe(len)

示例:

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

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

您可以使用__len__()代替,但__len__()看起来有点奇怪。

如何获取Pandas DataFrame的行数?

此表总结了您希望在DataFrame(或Series,为了完整性)中计数某些内容的不同情况,以及推荐的方法。

在此处输入图片描述

脚注

  1. DataFrame.count将每列的计数作为Series返回,因为非空计数因列而异。
  2. DataFrameGroupBy.size返回Series,因为同一组中的所有列共享相同的行计数。
  3. DataFrameGroupBy.count返回DataFrame,因为同一组中的各列的非空计数可能不同。要获取特定列的分组非空计数,请使用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    B0  a    x1  a    x2  b  NaN3  b    x4  c  NaN
s
0      x1      x2    NaN3      x4    NaNName: B, dtype: object

数据帧的行数:len(df)df.shape[0]len(df.index)

len(df)# 5
df.shape[0]# 5
len(df.index)# 5

比较常数时间操作的性能似乎很傻,尤其是当差异在“认真地,不要担心”的水平上时。但这似乎是其他答案的趋势,所以为了完整性,我也这样做了。

在上述三种方法中,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是一个属性,它返回元素的数量(=计数的行)。DataFrames还定义了一个size属性,该属性返回与df.shape[0] * df.shape[1]相同的结果。

非空行计数:DataFrame.countSeries.count

这里描述的方法只计算非空值(意味着NaN被忽略)。

调用#0将返回每个列的非NaN计数:

df.count()
A    5B    3dtype: int64

对于系列,使用#0达到类似的效果:

s.count()# 3

分组行计数:GroupBy.size

对于DataFrames,使用#1计算每个组的行数。

df.groupby('A').size()
Aa    2b    2c    1dtype: int64

同样,对于Series,您将使用#1

s.groupby(df.A).size()
Aa    2b    2c    1Name: B, dtype: int64

在这两种情况下,都会返回Series。这对DataFrames也有意义,因为所有组共享相同的行数。

组非空行计数:GroupBy.count

与上面类似,但使用#0,而不是GroupBy.size。请注意,size总是返回Series,而count如果在特定列上调用,则返回Series,否则返回DataFrame

以下方法返回相同的内容:

df.groupby('A')['B'].size()df.groupby('A').size()
Aa    2b    2c    1Name: B, dtype: int64

对于count,我们有

df.groupby('A').count()
BAa  2b  1c  0

…调用整个GroupBy对象,vs.,

df.groupby('A')['B'].count()
Aa    2b    1c    0Name: B, dtype: int64

在特定列上调用。

找出数据框中行数的另一种方法是#0,我认为这是最可读的变体。

请注意,正如我在公认的答案上评论的那样,

怀疑pandas.Index.size实际上比len(df.index)快,但我电脑上的timeit告诉我不是这样(每个循环慢约150 ns)。

我不确定这是否有效(省略数据可以),但这可能有效:

*dataframe name*.tails(1)

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

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

方法1:使用len函数:

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

方法2:使用count函数:

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

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

你也可以这样做:

假设df是你的数据框。然后df.shape给你数据框的形状,即(row,col)

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

 row = df.shape[0], col = df.shape[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 rowsnu_rows = data_fr.shape[0]print(nu_rows)

使用len(df)len(df.index)时,您可能会遇到以下错误:

----> 4 df['id'] = np.arange(len(df.index)TypeError: 'int' object is not callable

解决方案

lengh = df.shape[0]

Len(df.index)将以列出的所有方式中最快的方式工作