482

DataFrameパンダが空かどうかを確認するには? 私の場合、ターミナルDataFrameが空の場合にメッセージを出力したいと思います。

4

5 に答える 5

95

機能を利用していlenます。よりもはるかに高速ですemptylen(df.index)はさらに高速です。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10000, 4), columns=list('ABCD'))

def empty(df):
    return df.empty

def lenz(df):
    return len(df) == 0

def lenzi(df):
    return len(df.index) == 0

'''
%timeit empty(df)
%timeit lenz(df)
%timeit lenzi(df)

10000 loops, best of 3: 13.9 µs per loop
100000 loops, best of 3: 2.34 µs per loop
1000000 loops, best of 3: 695 ns per loop

len on index seems to be faster
'''
于 2014-07-24T12:06:18.817 に答える
25

データフレームが空かどうかを確認するには、データフレームの列 index の長さをテストする必要があると主張します。

if len(df.columns) == 0: 1

理由:

Pandas Reference APIによると、次の違いがあります。

  • 0 行0列の空のデータフレーム
  • NaNしたがって、少なくとも 1 列を含む行を持つ空のデータフレーム

おそらく、それらは同じではありません。他の答えはdf.empty、 、len(df)、またはlen(df.index)を区別しないという点で不正確であり、どちらの場合もインデックスは 0で、空は Trueを返します。

例 1: 0 行と 0 列の空のデータフレーム

In [1]: import pandas as pd
        df1 = pd.DataFrame()
        df1
Out[1]: Empty DataFrame
        Columns: []
        Index: []

In [2]: len(df1.index)  # or len(df1)
Out[2]: 0

In [3]: df1.empty
Out[3]: True

例 2: 0 行に空にされたが、n列を保持しているデータフレーム

In [4]: df2 = pd.DataFrame({'AA' : [1, 2, 3], 'BB' : [11, 22, 33]})
        df2
Out[4]:    AA  BB
        0   1  11
        1   2  22
        2   3  33

In [5]: df2 = df2[df2['AA'] == 5]
        df2
Out[5]: Empty DataFrame
        Columns: [AA, BB]
        Index: []

In [6]: len(df2.index)  # or len(df2)
Out[6]: 0

In [7]: df2.empty
Out[7]: True

ここで、インデックスが 0空が Trueである前の例に基づいて構築します。最初にロードされたデータフレーム df1の列インデックスの長さを読み取ると、実際に空であることを証明するために 0 列が返されます。

In [8]: len(df1.columns)
Out[8]: 0

In [9]: len(df2.columns)
Out[9]: 2

重要なことに、2 番目のデータフレーム df2 にはデータが含まれていませんが、永続的な空の列の量を返すため、完全に空ではありません。

重要な理由

これらのデータフレームに新しい列を追加して、その意味を理解しましょう。

# As expected, the empty column displays 1 series
In [10]: df1['CC'] = [111, 222, 333]
         df1
Out[10]:    CC
         0 111
         1 222
         2 333
In [11]: len(df1.columns)
Out[11]: 1

# Note the persisting series with rows containing `NaN` values in df2
In [12]: df2['CC'] = [111, 222, 333]
         df2
Out[12]:    AA  BB   CC
         0 NaN NaN  111
         1 NaN NaN  222
         2 NaN NaN  333
In [13]: len(df2.columns)
Out[13]: 3

df2 の元の列が再表示されたことは明らかです。したがって、代わりに列インデックスの長さを読み取ってlen(pandas.core.frame.DataFrame.columns)、データフレームが空かどうかを確認することをお勧めします。

実用的なソリューション

# New dataframe df
In [1]: df = pd.DataFrame({'AA' : [1, 2, 3], 'BB' : [11, 22, 33]})
        df
Out[1]:    AA  BB
        0   1  11
        1   2  22
        2   3  33

# This data manipulation approach results in an empty df
# because of a subset of values that are not available (`NaN`)
In [2]: df = df[df['AA'] == 5]
        df
Out[2]: Empty DataFrame
        Columns: [AA, BB]
        Index: []

# NOTE: the df is empty, BUT the columns are persistent
In [3]: len(df.columns)
Out[3]: 2

# And accordingly, the other answers on this page
In [4]: len(df.index)  # or len(df)
Out[4]: 0

In [5]: df.empty
Out[5]: True
# SOLUTION: conditionally check for empty columns
In [6]: if len(df.columns) != 0:  # <--- here
            # Do something, e.g. 
            # drop any columns containing rows with `NaN`
            # to make the df really empty
            df = df.dropna(how='all', axis=1)
        df
Out[6]: Empty DataFrame
        Columns: []
        Index: []

# Testing shows it is indeed empty now
In [7]: len(df.columns)
Out[7]: 0

新しいデータ系列を追加すると、空の列が再表示されることなく期待どおりに機能します (実際には、行のみを含む系列はありませんNaN)。

In [8]: df['CC'] = [111, 222, 333]
         df
Out[8]:    CC
         0 111
         1 222
         2 333
In [9]: len(df.columns)
Out[9]: 1
于 2019-01-02T16:38:40.543 に答える
14

私は長い道のりを行く方が好きです。これらは、try-except 句の使用を避けるために私が従うチェックです -

  1. 変数が None でないかどうかを確認します
  2. 次に、データフレームかどうかを確認し、
  3. 空でないことを確認してください

ここにDATA、疑わしい変数があります -

DATA is not None and isinstance(DATA, pd.DataFrame) and not DATA.empty
于 2015-08-20T13:50:23.527 に答える