Python 如果所有行都包含NaN、[](空列表)或{}(空dict),则删除列

Python 如果所有行都包含NaN、[](空列表)或{}(空dict),则删除列,python,pandas,dataframe,Python,Pandas,Dataframe,如果特定列中的所有行都是null、[](空数组)或{}(空dict),则该列将被删除。我知道dropna()函数,但它似乎只是在删除NA,那么空数组和空dict呢?使用where和astype(bool)来处理空容器,然后isna和all来获得一个掩码来相应地删除列 df.loc[:, ~df.where(df.astype(bool)).isna().all(axis=0)] 警告:这将拾取误报,例如满是零或假的列(实际上是假值) 为了克服我提到的警告,我们可以使用select\u dty

如果特定列中的所有行都是null、[](空数组)或{}(空dict),则该列将被删除。我知道
dropna()
函数,但它似乎只是在删除NA,那么空数组和空dict呢?

使用
where
astype(bool)
来处理空容器,然后
isna
all
来获得一个掩码来相应地删除列

df.loc[:, ~df.where(df.astype(bool)).isna().all(axis=0)]
警告:这将拾取误报,例如满是零或假的列(实际上是假值)


为了克服我提到的警告,我们可以使用
select\u dtypes
仅选择对象列,然后重复该过程,并在最后调用
drop

df = pd.DataFrame({
    'A': [np.nan, [], {}], 
    'B': range(3), 
    'C': [1, 2, np.nan], 
    'D': 0
})    
df

     A  B    C  D
0  NaN  0  1.0  0
1   []  1  2.0  0
2   {}  2  NaN  0

u = df.select_dtypes(object)
df.drop(u.columns[u.where(u.astype(bool)).isna().all(axis=0)], axis=1)

   B    C  D
0  0  1.0  0
1  1  2.0  0
2  2  NaN  0
df = pd.DataFrame({
    'A': [np.nan, [], {}], 
    'B': range(3), 
    'C': [1, 2, np.nan], 
    'D': 0
})    
df

     A  B    C  D
0  NaN  0  1.0  0
1   []  1  2.0  0
2   {}  2  NaN  0

u = df.select_dtypes(object)
df.drop(u.columns[u.where(u.astype(bool)).isna().all(axis=0)], axis=1)

   B    C  D
0  0  1.0  0
1  1  2.0  0
2  2  NaN  0