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

时间:2019-06-13 02:29:32

标签: python pandas dataframe

如果特定列中的所有行均为null,[](空数组)或{}(空字典),则该列将被删除。我知道square2函数,但似乎只删除了NA,空数组和空dict呢?

1 个答案:

答案 0 :(得分:1)

使用whereastype(bool)处理空容器,然后使用isnaall得到一个掩码,以相应地删除列。

df.loc[:, ~df.where(df.astype(bool)).isna().all(axis=0)]

注意:这将获取误报,例如充满零的列或False(有效地是虚假的值)。

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

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

df.loc[:, ~df.where(df.astype(bool)).isna().all(axis=0)]

   B    C
0  0  1.0
1  1  2.0
2  2  NaN

要克服我提到的警告,我们可以使用select_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