如何获取 Pandas DataFrame 的行数?

Posted

技术标签:

【中文标题】如何获取 Pandas DataFrame 的行数?【英文标题】:How do I get the row count of a Pandas DataFrame? 【发布时间】:2021-07-29 21:25:49 【问题描述】:

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

方法一:

total_rows = df.count
print total_rows + 1

方法二:

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

两个代码 sn-ps 都给我这个错误:

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

我做错了什么?

【问题讨论】:

好吧我发现了,我应该调用方法而不是检查属性,所以应该是 df.count() no df.count ^ 危险!请注意,df.count() 只会返回每列的非 NA/NaN 行数。您应该改用df.shape[0],它会始终正确地告诉您行数。 请注意,当数据框为空时,df.count 不会返回 int(例如,pd.DataFrame(columns=["Blue","Red").count 不是 0) 【参考方案1】:

对于数据框df,可以使用以下任何一种:

len(df.index) df.shape[0] df[df.columns[0]].count()(== number of non-NaN values 在第一列)


重现情节的代码:

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",
)

【讨论】:

在交互式工作中使用shape 而不是 len(df) 有一个很好的理由:尝试不同的过滤,我经常需要知道还有多少项目。有了形状,我只需在过滤后添加 .shape 就可以看到这一点。使用 len() 来编辑命令行变得更加麻烦。 不适用于 OP,但如果您只需要知道数据框是否为空,df.empty 是最佳选择。 我知道已经有一段时间了,但不是 len(df.index) 需要 381 纳秒或 0.381 微秒,df.shape 慢了 3 倍,需要 1.17 微秒。我错过了什么? @root (3,3) 矩阵是不好的例子,因为它没有显示形状元组的顺序 df.shape[0]len(df)len(df.columns) 快多少?由于 1 ns(纳秒)=1000 µs(微秒),因此 1.17µs = 1170ns,这意味着它大约比 381ns 慢 3 倍【参考方案2】:

假设 df 是您的数据框,那么:

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

或者,更简洁,

r, c = df.shape

【讨论】:

如果数据集很大,如果只需要行数,len (df.index) 明显快于 df.shape[0]。我测试过了。 为什么我的 DataFrame 上没有 shape 方法? @ArdalanShahgholi 这可能是因为返回的是一个系列,它始终是一维的。因此,只有len(df.index) 可以工作 @Connor 我需要我的 DF 中的行数和列数。在我的 DF 中,我也有一个选择,这意味着我有一张桌子,现在的问题是为什么我的 DF 上没有 SHAPE 功能? 好问题,把它作为一个单独的问题,分享你尝试过的和你看到的结果(提供一套完整的工作代码,其他人可以轻松复制)然后分享该问题的链接在这里。我看看能不能帮忙【参考方案3】:

使用len(df) :-)。

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

计时信息,设置方法同root's answer:

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) 非常易读。

【讨论】:

我绝对同意采用更具可读性的方法的建议,即使价格约为 200 ns :)【参考方案4】:

如何获取 Pandas DataFrame 的行数?

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

脚注

    DataFrame.count 将每列的计数返回为 Series,因为非空计数因列而异。 DataFrameGroupBy.size 返回 Series,因为同一组中的所有列共享相同的行数。 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    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.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 将为 each 列返回非 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 对象,vs.,

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

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

在特定列上调用。

【讨论】:

【参考方案5】:

TL;DR 使用len(df)

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

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

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

【讨论】:

@BrendanMetcalfe,我不知道你的数据框可能有什么问题,而没有看到它的数据。您可以检查小脚本的末尾看看,确实len 非常适合获取行数。这是脚本onecompiler.com/python/3xc9nuvrx 我明白了,谢谢 @BrendanMetcalfe 没问题。如果有帮助,欢迎您投票...【参考方案6】:

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

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

【讨论】:

这会返回索引对象,它们可能是也可能不是原始的副本,如果您只是在检查长度后丢弃它们,这是一种浪费。除非您打算对索引做任何其他事情,否则请勿使用【参考方案7】:

...以Jan-Philip Gehrcke's answer 为基础。

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]

【讨论】:

语法高亮似乎不太正确。你能修好它吗?例如,这是输出、代码和注释的混合体(不是反问)? @PeterMortensen 此输出来自 ipython/jupyter。执行带有两个问号且不带括号的函数名称将显示函数定义。即对于函数len(),您将执行len??【参考方案8】:

我从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.

【讨论】:

在使用Pandas一段时间后,我认为我们应该选择df.shape。它分别返回行数和列数。【参考方案9】:

你也可以这样做:

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

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

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

【讨论】:

或者你可以直接使用row, col = df.shape来代替,如果你需要同时获得它们(它更短,你不必关心索引)。【参考方案10】:

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

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)。前者只是没有函数调用的属性查找。【参考方案11】:

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

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

例子:

nrow(my_df)
12,456,789

【讨论】:

【参考方案12】:

这两种都可以(df是DataFrame的名字):

方法一:使用len函数:

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

方法二:使用count函数:

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

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

【讨论】:

这是一个很好的答案,但是这个问题已经有足够的答案了,所以这并没有真正添加任何东西。【参考方案13】:

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

请注意,正如我对 the accepted answer 的评论,

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

【讨论】:

【参考方案14】:

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

*dataframe name*.tails(1)

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

【讨论】:

【参考方案15】:

想一想,数据集是“数据”,并将您的数据集命名为“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)

【讨论】:

【参考方案16】:
# this will give you the number of rows in the dataframe df
df.shape[0]

【讨论】:

使用 df.shape[0] 是 2013 年接受的答案中讨论的可能解决方案之一。

以上是关于如何获取 Pandas DataFrame 的行数?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 Pandas DataFrame 的行数?

Pandas获取DataFrame的行数和列数

如何计算包含一组列中的值和 Pandas 数据框中另一列中的另一个值的行数?

Pandas DataFrame:如何获取列平均值但仅考虑索引低于我想要获取平均值的行

Python Pandas:获取列不为空的DataFrame的行

Pandas - 在 DataFrame 中的任何位置查找值索引