1504

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

方法一:

total_rows = df.count
print total_rows + 1

方法二:

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

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

类型错误:+ 不支持的操作数类型:“instancemethod”和“int”

我究竟做错了什么?

4

15 回答 15

2203

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

性能图


重现情节的代码:

import numpy as np
import pandas as pd
import 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",
)
于 2013-04-11T08:24:29.633 回答
422

假设df您的数据框是:

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

或者,更简洁地说,

r, c = df.shape
于 2016-02-20T13:30:05.467 回答
228

使用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)可读性很强。

于 2013-08-19T15:02:45.520 回答
130

如何获取 Pandas DataFrame 的行数?

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

在此处输入图像描述

脚注

  1. DataFrame.count将每列的计数作为 a 返回,Series因为非空计数因列而异。
  2. DataFrameGroupBy.size返回 a Series,因为同一组中的所有列共享相同的行数。
  3. DataFrameGroupBy.count返回 a 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    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 的行数: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)此处的示例。

DataFrame 的列数: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 还定义了一个 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都会返回 a。这也很有意义,DataFrames因为所有组共享相同的行数。

分组非空行数:GroupBy.count

与上面类似,但使用GroupBy.count,而不是GroupBy.size。请注意,size始终返回 a Series,而如果在特定列上调用,则count返回 a Series,否则返回 a 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 对象,与,

df.groupby('A')['B'].count()

A
a    2
b    1
c    0
Name: B, dtype: int64

在特定列上调用。

于 2019-03-30T19:55:03.587 回答
59

TL;DR使用len(df)

len()让您获取列表中的项目数。因此,要获取 DataFrame 的行数,只需使用len(df).

df.index或者,您可以分别使用和访问所有行和所有列df.columns。由于您可以使用len(anyList)获取元素编号,因此使用 len(df.index)将为您提供行数,并len(df.columns)提供列数。

或者,您可以使用df.shapewhich 返回行数和列数(作为元组)。如果要访问行数,请仅使用df.shape[0]. 对于列数,仅使用:df.shape[1]

于 2016-06-25T05:23:38.267 回答
23

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

total_rows = len(df.axes[0])
total_cols = len(df.axes[1])
于 2015-08-19T19:07:17.247 回答
12

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

len(df)orlen(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]

于 2017-12-07T23:37:11.680 回答
9

我从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.
于 2016-09-29T07:41:41.697 回答
7

你也可以这样做:

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

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

 row = df.shape[0], col = df.shape[1]
于 2020-05-12T07:14:24.350 回答
6

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

df.pipe(len)

例子:

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

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

你可以__len__()改用,但__len__()看起来有点奇怪。

于 2018-02-22T02:58:24.607 回答
3

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

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

例子:

nrow(my_df)
12,456,789
于 2017-09-21T01:59:14.190 回答
3

任何一个都可以做到(df是DataFrame的名称):

方法一:使用len功能:

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

方法2:使用count功能:

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

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

于 2020-04-24T16:30:22.207 回答
0

找出数据框中行数的另一种方法是pandas.Index.size.

请注意,正如我评论接受的答案

Suspectedpandas.Index.size实际上会比len(df.index)timeit在我的计算机上告诉我的速度更快(每个循环慢约 150 ns)。

于 2020-02-24T15:14:22.540 回答
0

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

*dataframe name*.tails(1)

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

于 2020-04-05T19:49:33.853 回答
-1

想一想,数据集是“数据”并将您的数据集命名为“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)
于 2021-01-02T23:04:44.147 回答