Hoe controleer je of een pandas DataFrame leeg is?

Hoe controleer ik of een panda’s DataFrameleeg is? In mijn geval wil ik een bericht in de terminal afdrukken als het DataFrameleeg is.


Antwoord 1, autoriteit 100%

Je kunt het attribuut df.emptygebruiken om te controleren of het leeg is of niet:

if df.empty:
    print('DataFrame is empty!')

Bron: Pandas-documentatie


Antwoord 2, autoriteit 12%

Ik gebruik de functie len. Het is veel sneller dan empty. len(df.index)is nog sneller.

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
'''

Antwoord 3, autoriteit 2%

Om te zien of een dataframe leeg is, pleit ik ervoor om te testen op de lengte van de kolommenindex van een dataframe:

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

Reden:

Volgens de Pandas Reference API , er is een onderscheid tussen:

  • een leeg dataframe met 0 rijen en 0 kolommen
  • een leeg dataframe met rijen die NaNbevatten, dus minstens 1 kolom

Waarschijnlijk zijn ze niet hetzelfde. De andere antwoorden zijn onnauwkeurig omdat df.empty, len(df)of len(df.index)geen onderscheid maken en index is 0en leeg is Truein beide gevallen.

Voorbeelden

Voorbeeld 1: een leeg dataframe met 0 rijen en 0 kolommen

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

Voorbeeld 2: een dataframe dat wordt leeggemaakt tot 0 rijen maar nog steeds nkolommen

bevat

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

Voortbouwend op de vorige voorbeelden, waarin de index 0is en leeg True. Bij het lezen van de lengte van de kolommenindexvoor het eerste geladen dataframe df1, retourneert het 0 kolommen om te bewijzen dat het inderdaad leeg is.

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

Kritiek gezien, terwijl het tweede dataframe df2 geen gegevens bevat, is het niet helemaal leegomdat het het aantal lege kolommen retourneert dat blijft bestaan.

Waarom het belangrijk is

Laten we een nieuwe kolom aan deze dataframes toevoegen om de implicaties te begrijpen:

# 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

Het is duidelijk dat de originele kolommen in df2 opnieuw zijn opgedoken. Daarom is het verstandig om in plaats daarvan de lengte van de kolommenindexte lezen met len(pandas.core.frame.DataFrame.columns)om te zien of een dataframe leeg is.

Praktische oplossing

# 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

Het toevoegen van een nieuwe data-serie werkt zoals verwacht zonder het opnieuw opduiken van lege kolommen (feitelijk, zonder enige serie die rijen met alleen NaN) bevatten:

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

4

1) Als een dataframe nan en niet-null-waarden heeft en u wilt vinden of het DATAFAME
is leeg of probeer deze code niet.
2) Wanneer deze situatie kan gebeuren?
Deze situatie gebeurt wanneer een enkele functie wordt gebruikt om meer dan één dataframe te plotten
die worden doorgegeven als parameter. In een dergelijke situatie probeert de functie de gegevens te plotten, zelfs
Wanneer een dataframe leeg is en dus een lege figuur plot!. 
Het is logisch als u het bericht 'DataFrame heeft geen gegevens' weergeeft.
3) waarom?
als een DataFrame leeg is (d.w.z. helemaal geen gegevens bevat. Let op DataFrame met Nan-waarden
wordt als niet leeg beschouwd) dan is het wenselijk om niet te plotten maar een bericht uit te brengen:
Stel dat we twee DataFrames df1 en df2 hebben.
De functie myfunc neemt elk DataFrame (df1 en df2 in dit geval) en drukt een bericht af
als een DataFrame leeg is (in plaats van plotten):
df1                     df2
col1 col2           col1 col2 
Nan   2              Nan  Nan 
2     Nan            Nan  Nan  

en de functie:

def myfunc(df):
  if (df.count().sum())>0: ##count the total number of non Nan values.Equal to 0 if DataFrame is empty
     print('not empty')
     df.plot(kind='barh')
  else:
     display a message instead of plotting if it is empty
     print('empty')

Other episodes