如何获取大熊猫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
一个数据帧的行数:len(df)
,df.shape[0]
或len(df.index)
len(df)
# 5
df.shape[0]
# 5
len(df.index)
# 5
比较固定时间操作的性能似乎很愚蠢,尤其是当差异处于“严重不担心”级别时。但是,这似乎是带有其他答案的趋势,因此为了完整性,我正在做同样的事情。
在上述3种方法中,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.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
将返回每列的非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
返回Series
if,否则返回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对象v / s上调用
df.groupby('A')['B'].count()
A
a 2
b 1
c 0
Name: B, dtype: int64
在特定列上调用。