删除所有行和列标题都为na的数据框列。

5

我有一个数据框,其中包含许多NoneType值,我想要删除所有行值和列名都为None的列。我无法找到一种方法来实现这个目标。在下面的MWE中,我要么删除所有行都为None的列,要么删除所有列名为None的列。

from __future__ import annotations

import pandas as pd

d = [[1, 2, None, None, None], [4, 5, None, None, 7]]
cols = ['a', 'b', 'c', None, None]
df = pd.DataFrame(data=d, columns=cols)

print("Original: \n", df)
#Original: 
#    a  b     c   NaN  NaN
#0  1  2  None  None  NaN
#1  4  5  None  None  7.0

print("\nDropped how = all: \n", df.dropna(axis=1, how="all"))    # Drops column 'c'
#Dropped how = all: 
#    a  b  NaN
#0  1  2  NaN
#1  4  5  7.0

print("\nDropped None columns: \n", df[df.columns.dropna()])
#Dropped None columns: 
#    a  b     c
#0  1  2  None
#1  4  5  None

我如何只删除我想要删除的列并获得这样的结果?

#Wanted: 
#    a  b     c  NaN
#0  1  2  None   NaN
#1  4  5  None   7.0

这个回答解决了你的问题吗?Pandas:删除所有NaN列 - meph
3个回答

8

您可以使用2个条件,并使用&进行反转并使用.loc[]

df.loc[:,~(df.columns.isna() & df.isna().all())]

   a  b     c  NaN
0  1  2  None  NaN
1  4  5  None  7.0

2
DeMorgan的版本 df.loc[:, df.notna().any() | df.columns.notna()] - piRSquared
1
@piRSquared 不错,我相信更有效率。谢谢您,先生 :) - anky

5
这里有一种方法,使用notnaany对数据帧进行布尔索引,根据条件筛选内容:
df.loc[:, (df.notna() | df.columns.notna()).any(0)]

   a  b     c  NaN
0  1  2  None  NaN
1  4  5  None  7.0

4

IIUC

df.loc[:,df.T.reset_index().notna().any(1).values]
   a  b     c  NaN
0  1  2  None  NaN
1  4  5  None  7.0

1
这正是我想到的第一件事。好吧,接近 df.loc[:, [*df.T.reset_index().notna().any(1)]] - piRSquared

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接