如何获取 pandas 数据框 df
的行数?
df.count()
只会返回每列的非 NA/NaN 行数。您应该改用 df.shape[0]
,它会始终正确地告诉您行数。
对于数据框 df
,可以使用以下任何一种:
长度(df.index)
df.shape[0]
df[df.columns[0]].count() (== 第一列中非 NaN 值的数量)
https://i.stack.imgur.com/wEzue.png
重现情节的代码:
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",
)
假设 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)
可以工作
使用 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)
非常易读。
如何获取 Pandas DataFrame 的行数?
此表总结了您希望在 DataFrame(或 Series,为了完整性)中计算某些内容的不同情况,以及推荐的方法。
https://i.stack.imgur.com/3FXuI.png
脚注 DataFrame.count 将每列的计数作为一个系列返回,因为非空计数因列而异。 DataFrameGroupBy.size 返回一个系列,因为同一组中的所有列共享相同的行数。 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.size, len(s.index)
len(s)
# 5
s.size
# 5
len(s.index)
# 5
s.size
和 len(s.index)
在速度方面大致相同。但我推荐len(df)
。
注意 size 是一个属性,它返回元素的数量(=任何系列的行数)。 DataFrames 还定义了一个 size 属性,它返回与 df.shape[0] * df.shape[1] 相同的结果。
非空行数:DataFrame.count 和 Series.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 对象,与,
df.groupby('A')['B'].count()
A
a 2
b 1
c 0
Name: B, dtype: int64
在特定列上调用。
s.shape[0]
用于系列中的行数。
TL;DR 使用 len(df)
len()
返回列表对象的项目数(长度)(也适用于字典、字符串、元组或范围对象)。因此,要获取 DataFrame 的行数,只需使用 len(df)
。有关 len 函数的更多信息,请参阅the official page。
或者,您可以分别使用 df.index
和 df.columns
访问所有行和所有列。由于您可以使用 len(anyList)
来获取元素编号,因此使用 len(df.index)
将给出行数,而 len(df.columns)
将给出列数。
或者,您可以使用 df.shape
一起返回行数和列数(作为元组),您可以在其中访问每个项目及其索引。如果要访问行数,请仅使用 df.shape[0]
。对于列数,仅使用:df.shape[1]
。
len
非常适合获取行数。这是脚本 onecompiler.com/python/3xc9nuvrx
除了前面的答案,您可以使用 df.axes
获取具有行和列索引的元组,然后使用 len()
函数:
total_rows = len(df.axes[0])
total_cols = len(df.axes[1])
...在 Jan-Philip Gehrcke's answer 上构建。
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]
快
len()
,您将执行 len??
我是从 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.
df.shape
。它分别返回行数和列数。
你也可以这样做:
假设 df
是您的数据框。然后 df.shape
为您提供数据框的形状,即 (row,col)
因此,分配以下命令以获得所需的
row = df.shape[0], col = df.shape[1]
row, col = df.shape
(它更短并且您不必关心索引)。
如果您想在链接操作的中间获取行数,您可以使用:
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)
。前者只是没有函数调用的属性查找。
这两种方法都可以(df
是 DataFrame 的名称):
方法一:使用len
函数:
len(df)
将给出名为 df
的 DataFrame 中的行数。
方法二:使用count
函数:
df[col].count()
将计算给定列 col
中的行数。
df.count()
将给出所有列的行数。
对于数据帧 df,在探索数据时使用打印的逗号格式的行数:
def nrow(df):
print("{:,}".format(df.shape[0]))
例子:
nrow(my_df)
12,456,789
找出数据框中行数的另一种方法是pandas.Index.size
,我认为这是最易读的变体。
请注意,正如我对 the accepted answer 的评论,
怀疑 pandas.Index.size 实际上会比 len(df.index) 快,但我计算机上的 timeit 告诉我否则(每个循环慢约 150 ns)。
我不确定这是否可行(数据可以省略),但这可能可行:
*dataframe name*.tails(1)
然后使用它,您可以通过运行代码片段并查看提供给您的行号来找到行数。
使用 len(df)
或 len(df.index)
时,您可能会遇到此错误:
----> 4 df['id'] = np.arange(len(df.index)
TypeError: 'int' object is not callable
解决方案:
lengh = df.shape[0]
想一想,数据集是“数据”并将您的数据集命名为“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)
shape
而不是 len(df) 有一个很好的理由:尝试不同的过滤,我经常需要知道还有多少项目。有了形状,我只需在过滤后添加 .shape 就可以看到这一点。使用 len(),命令行的编辑变得更加麻烦,来回进行。df.empty
是最佳选择。df.shape[0]
比len(df)
或len(df.columns)
快多少?由于 1 ns(纳秒)= 1000 µs(微秒),因此 1.17µs = 1170ns,这意味着它大约比 381ns 慢 3 倍