长答案:视情况而定
根据您对空的定义,您的答案可能会有很大差异,正如其他各种答案所示。我试着总结一下,但首先有一些测试DataFrames:
no_rows = pd.DataFrame([], columns=list('ABCD'))
no_cols = pd.DataFrame([], index=range(3))
only_na = pd.DataFrame(float('nan'), index=range(3), columns=list('ABCD'))
空 == 没有行
目前最流行的回答是采用这种方式:0行的DataFrame是空的:
def empty_no_rows(df):
return len(df.index) == 0
空 == 没有列
尚未提及,但同样有效的是转置定义:
def empty_no_cols(df):
return len(df.columns) == 0
空 == 没有值
其实不是,你关心的是价值观!如果您更喜欢可以同时处理空 index 或 columns 的定义,则以下定义将起作用:
def empty_no_vals(df):
return df.values.size == 0
空 == pandas 说的
为什么不接受 pandas 自己的空虚定义,这对于这些测试用例会导致与无值定义相同的结果:
def empty_native(df):
return df.empty
Pandas 自己的实现基本上只是检查len(df.columns) == 0 or len(df.index) == 0,从不直接查看values。
空 == 不仅是 NaN
最后,您可能想在考虑中忽略NaN:
def empty_nans(df):
return df.dropna(how='all').empty
但实际上,这会打开下一个蠕虫,因为您现在必须决定 how 以及要丢弃哪个 axis?我在这里坚持更保守的all。一旦删除了这些值,您现在可以将上述所有定义应用于其结果。
比较
| DataFrame |
empty_no_rows |
empty_no_cols |
empty_no_vals |
empty_native |
empty_nans |
no_rows |
✅ True |
❌ False |
✅ True |
✅ True |
✅ True |
no_cols |
❌ False |
✅ True |
✅ True |
✅ True |
✅ True |
only_na |
❌ False |
❌ False |
❌ False |
❌ False |
✅ True |
编者注:我将所有这些函数都称为is_empty_...,但这会导致比较表太宽。