如何获取 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.size、len(s.index)
len(s)
# 5
s.size
# 5
len(s.index)
# 5
s.size 和len(s.index) 在速度方面差不多。但我推荐len(df)。
注意
size 是一个属性,它返回元素个数(=count
任何系列的行数)。 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 对象,vs.,
df.groupby('A')['B'].count()
A
a 2
b 1
c 0
Name: B, dtype: int64
在特定列上调用。