如何获取大熊猫 DataFrame 的行数?

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

答案

您可以使用.shape属性,也可以仅使用len(DataFrame.index) 。但是,存在明显的性能差异( len(DataFrame.index)是最快的):

In [1]: import numpy as np

In [2]: import pandas as pd

In [3]: df = pd.DataFrame(np.arange(12).reshape(4,3))

In [4]: df
Out[4]: 
   0  1  2
0  0  1  2
1  3  4  5
2  6  7  8
3  9  10 11

In [5]: df.shape
Out[5]: (4, 3)

In [6]: timeit df.shape
2.77 µs ± 644 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [7]: timeit df[0].count()
348 µs ± 1.31 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [8]: len(df.index)
Out[8]: 4

In [9]: timeit len(df.index)
990 ns ± 4.97 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

在此处输入图片说明

编辑:正如 @Dan Allen 在评论中指出len(df.index)df[0].count()不可互换,因为count排除了NaN

假设df是您的数据帧,则:

count_row = df.shape[0]  # gives number of row count
count_col = df.shape[1]  # gives number of col count

或者,更简洁地说,

r, c = df.shape

使用len(df) 。从熊猫 0.11 开始,甚至更早版本。

__len__()当前(0.12)记录为Returns length of index 。时间信息,设置方法与 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)慢一点,但这在大多数用例中都不起作用。

如何获取大熊猫 DataFrame 的行数?

下表总结了您希望在 DataFrame(或 Series,为了完整起见)中进行计数的不同情况,以及推荐的方法。

在此处输入图片说明

脚注

  1. 由于非 null 计数随列而变化,因此DataFrame.count返回作为Series每一列的计数。
  2. DataFrameGroupBy.size返回Series ,因为同一组中的所有列共享相同的行数。
  3. DataFrameGroupBy.count返回一个DataFrame ,因为非空计数可能在同一组的各个列之间有所不同。要获取特定列的df.groupby(...)['x'].count()组非空计数,请使用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示例, df.shape返回(8, 2) 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.sizelen(s.index)

len(s)
# 5

s.size
# 5

len(s.index)
# 5

s.sizelen(s.index)在速度方面大致相同。但我建议len(df)

注意
size是一个属性,它返回元素的数量(= 任何 Series 的行数)。 DataFrames 还定义了一个 size 属性,该属性返回与df.shape[0] * df.shape[1]相同的结果。

非空行数: DataFrame.countSeries.count

此处描述的方法仅计算非空值(表示忽略 NaN)。

调用DataFrame.count将为列返回非 NaN 计数:

df.count()

A    5
B    3
dtype: int64

对于 Series,请使用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 。这对于DataFramesDataFrames ,因为所有组共享相同的行数。

按组的非空行计数: GroupBy.count

与上面类似,但是使用GroupBy.count ,而不是GroupBy.size 。请注意,如果在特定列或DataFrame上调用,则size始终返回Series ,而count返回Series

以下方法返回相同的内容:

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

在特定列上调用。

len()是您的朋友,行计数的简短答案是len(df)

另外,您也可以访问所有行df.index和所有列由df.columns ,并且可以使用len(anyList)用于获取列表的数量,因此你可以使用len(df.index)用于获取数行数,列数为len(df.columns)

另外,您可以使用df.shape一起返回行数和列数,如果要访问行数,请仅使用df.shape[0] ;对于列数,请仅使用: df.shape[1]

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

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

... 以 Jan-Philip Gehrcke 的答案为基础。

len(df)len(df.index)df.shape[0]快的df.shape[0] 。看代码。 df.shape 是一个@property运行一个数据帧的方法调用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]

我从R背景来到熊猫,我发现选择行或列时熊猫要复杂得多。我不得不花了一段时间,然后找到了一些应对方法:

获取列数:

len(df.columns)  
## Here:
#df is your data.frame
#df.columns return a string, it contains column's titles of the df. 
#Then, "len()" gets the length of it.

获取行数:

len(df.index) #It's similar.

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

df.pipe(len)

例:

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

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

您可以改用__len __(),但__len __()看起来有点怪异。

对于数据框 df,在浏览数据时使用了以逗号分隔的打印的行数:

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

例:

nrow(my_df)
12,456,789