Hoe controleer ik of een panda’s DataFrame
leeg is? In mijn geval wil ik een bericht in de terminal afdrukken als het DataFrame
leeg is.
Antwoord 1, autoriteit 100%
Je kunt het attribuut df.empty
gebruiken 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
NaN
bevatten, 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 n
kolommen
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')