パンダのDataFrameの行数を取得するにはどうすればよいですか?


935

Pandasを使用してデータフレームdfの行数を取得しようとしています。これが私のコードです。

方法1:

total_rows = df.count
print total_rows +1

方法2:

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

どちらのコードスニペットでもこのエラーが発生します。

TypeError:+: 'instancemethod'および 'int'でサポートされていないオペランドタイプ

何が悪いのですか?


12
OK、私はプロパティをチェックせずにメソッドを呼び出すべきだったので、それはdf.count()でなければなりませんdf.count
yemu

56
^危険!df.count()各列の非NA / NaN行の数のみを返すことに注意してください。df.shape[0]代わりにを使用してください。これにより、常に行数が正しく表示されます。
smci 14

3
データフレームが空の場合、df.countはintを返さないことに注意してください(たとえば、pd.DataFrame(columns = ["Blue"、 "Red")。countは0ではありません)
Marcelo Bielsa

回答:


1253

.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)

ここに画像の説明を入力してください

EDIT:として@Danアレンコメントで指摘len(df.index)し、df[0].count()等の互換性がありませんcount除外NaNS、


13
shapelen(df)の代わりにインタラクティブな作業で使用する理由は1つあります。別のフィルタリングを試してみると、多くの場合、残っているアイテムの数を知る必要があります。形状では、フィルタリングの後に.shapeを追加するだけでそれを確認できます。len()を使用すると、コマンドラインの編集が前後に行ってはるかに面倒になります。
K.-Michael Aye 2014

9
OPでは機能しませんが、データフレームが空であるかどうかを知る必要があるだけの場合df.emptyは、最適なオプションです。
jtschoonhoven 2016年

19
しばらくの間はわかりますが、len(df.index)は381ナノ秒(0.381マイクロ秒)かかりません。df.shapeは3倍遅く、1.17マイクロ秒かかります。私は何か見落としてますか?@root
TG

11
(3,3)行列は、形状タプルの順序を示さないように悪い例である
xaedes

4
どのようにdf.shape[0]速くよりもlen(df)len(df.columns)?以降は1ns(ナノ秒)= 1000μsのそれは381nsよりも約3倍遅いです手段(マイクロ秒)、従って1.17μs= 1170ns、
itsjef

304

次に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

4
データセットが大きい場合、行数のみが必要な場合、len(df.index)はdf.shape [0]よりも大幅に高速です。私はそれをテストしました。
Sumit Pokhrel

145

を使用しlen(df)ます。これはパンダ0.11以降、あるいはそれ以前にも機能します。

__len__()は現在(0.12)で文書化されていReturns length of indexます。タイミング情報、ルートの答えと同じように設定します:

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

追加の関数呼び出しが1つあるため、len(df.index)直接呼び出すより少し遅くなりますが、ほとんどの場合、これは何の役割も果たしません。


81

パンダのDataFrameの行数を取得するにはどうすればよいですか?

この表は、DataFrame(またはSeries、完全を期す)で何かをカウントするさまざまな状況と推奨される方法をまとめたものです。

ここに画像の説明を入力してください

脚注

  1. DataFrame.countSeriesnull以外のカウントは列によって異なるため、各列のカウントをとして返します。
  2. DataFrameGroupBy.sizeSeries同じグループ内のすべての列が同じ行数を共有するため、が返されます。
  3. DataFrameGroupBy.countDataFramenull以外のカウントは同じグループ内の列間で異なる可能性があるため、を返します。特定の列のグループごとの非nullカウントを取得するには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)、2つの方法のうちの方が高速です(ただし、入力する文字数が多くなります)。

シリーズの行数:len(s)s.sizelen(s.index)

len(s)
# 5

s.size
# 5

len(s.index)
# 5

s.sizeそして、len(s.index)速度の点でほぼ同じです。しかし、私はお勧めしlen(df)ます。


sizeは属性であり、要素の数(=シリーズの行数)を返します。データフレームは、と同じ結果を返すサイズ属性も定義しますdf.shape[0] * df.shape[1]

null以外の行数:DataFrame.countおよびSeries.count

ここで説明するメソッドは、null以外の値のみをカウントします(つまり、NaNは無視されます)。

呼び出しDataFrame.countは、列の非NaNカウントを返します。

df.count()

A    5
B    3
dtype: int64

シリーズの場合Series.count、同様の効果を使用します。

s.count()
# 3

グループごとの行数: GroupBy.size

の場合DataFramesDataFrameGroupBy.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

どちらの場合も、a Seriesが返されます。DataFramesすべてのグループが同じ行数を共有するため、これも意味があります。

グループごとの非null行数: 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オブジェクト全体に対して呼び出されます、v / s、

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

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

特定の列で呼び出されます。


35

TL; DR

使用する len(df)


len()はあなたの友達です。これは、行カウントに使用できますlen(df)

また、あなたは、すべての行にアクセスすることができますdf.indexし、すべての列で df.columns、あなたが使用することができるようlen(anyList)、リストのカウントを取得するため、使用 len(df.index)行数を取得するための、およびlen(df.columns)列数のために。

それとも、あなたは使用することができdf.shapeますが、行数が使用のみにアクセスしたい場合は、一緒に行と列の数を返すdf.shape[0]と列数のためにのみ使用しますdf.shape[1]


19

上記の回答とは別に、使用df.axesして行と列のインデックスを持つタプルを取得し、len()関数を使用できます。

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

2
これはインデックスオブジェクトを返します。これは元のオブジェクトのコピーである場合とそうでない場合があり、長さを確認した後でそれらを破棄するだけでは無駄です。あなたは、インデックス、と何かするつもりない限りDO NOTを使用します
cs95

9

... Jan-Philip Gehrckeの答えに基づいています。

len(df)またはlen(df.index)よりも速い理由df.shape[0]。コードを見てください。df.shapeは、@propertyDataFrameメソッドをlen2回呼び出して実行するです。

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)関数呼び出しが1つ少ないためよりも少し高速ですが、これは常により高速です。df.shape[0]


7

私は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.

しばらくPandasを使った後は、に行くべきだと思いますdf.shape。行数と列数をそれぞれ返します。
Catbuiltは、

4

連鎖操作の途中で行数を取得したい場合は、以下を使用できます。

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)ます。前者は、関数呼び出しなしの単なる属性ルックアップです。
cs95

1

使用できるねえこれもこれを行います:

dfデータフレームとしましょう。それからdf.shapeあなたにあなたのデータフレームの形を与えます(row,col)

したがって、以下のコマンドを割り当てて、必要なものを取得します

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

0

データフレームdfの場合、データの探索中に使用される印刷されたコンマ形式の行数:

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

例:

nrow(my_df)
12,456,789

0

私が最も読みやすいバリアントであると私が思うデータフレーム内の行の量を見つける別の方法はpandas.Index.sizeです。

私が受け入れられた答えにコメントしたように注意してください:

疑わしいpandas.Index.sizeは実際よりも高速ですlen(df.index)timeit、私のコンピュータではそうでないことがわかります(ループごとに約150 ns遅い)。


0

これがうまくいくかどうかはわかりませんが(データは省略できます)、これはうまくいくかもしれません:

*dataframe name*.tails(1)

次に、これを使用して、コードスニペットを実行し、指定された行番号を確認することで、行数を見つけることができます。


-2

これのいずれかで実行できます(dfはDataFrameの名前です):

方法1:len関数を使用する:

len(df)という名前のDataFrameの行数を示しますdf

方法2:count関数を使用する:

df[col].count() 特定の列の行数をカウントします col

df.count() すべての列の行数を示します。


3
これは良い答えですが、この質問にはすでに十分な答えがあるので、これは実際には何も追加しません。
ジョン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.