提问人:shelly 提问时间:6/2/2012 最后编辑:smcishelly 更新时间:5/13/2021 访问量:105787
删除 Pandas 数据帧中的 NaN/NULL 列?
Remove NaN/NULL columns in a Pandas dataframe?
答:
120赞
Wes McKinney
6/2/2012
#1
是的。请参阅 http://pandas.pydata.org/pandas-docs/stable/missing_data.html 和文档字符串:dropna
DataFrame.dropna
Definition: DataFrame.dropna(self, axis=0, how='any', thresh=None, subset=None)
Docstring:
Return object with labels on given axis omitted where alternately any
or all of the data are missing
Parameters
----------
axis : {0, 1}
how : {'any', 'all'}
any : if any NA values are present, drop that label
all : if all values are NA, drop that label
thresh : int, default None
int value : require that many non-NA values
subset : array-like
Labels along other axis to consider, e.g. if you are dropping rows
these would be a list of columns to include
Returns
-------
dropped : DataFrame
要运行的特定命令为:
df=df.dropna(axis=1,how='all')
评论
1赞
zach
10/11/2012
你能指定'dropna'值吗?例如,你能删除全是零的行吗?
7赞
K.-Michael Aye
12/11/2012
您可以使用 pandas io 解析器定义给定输入表中的 NaN 值为 0,或者,您可以像这样准备您的步骤:df[df==0] = np.nan ; df=df.dropna(axis=1,how='all')
1赞
brokenfoot
11/22/2018
就地:df.dropna(axis=1,how='all',inplace=True)
0赞
Jade Cacho
1/7/2020
我使用了,但它删除了我所有的 df 列。其他列并非完全为空。df=df.dropna(axis=1,how='all')
-2赞
ajay singh
6/29/2018
#2
用于从数据框中删除所有空列的函数:
def Remove_Null_Columns(df):
dff = pd.DataFrame()
for cl in fbinst:
if df[cl].isnull().sum() == len(df[cl]):
pass
else:
dff[cl] = df[cl]
return dff
此函数将从 df 中删除所有 Null 列。
评论
2赞
Noki
9/4/2018
拜托,如果你回答了什么,至少使用正确的指南风格,比如 pep8......此外,pandas 提供了 dropna() 函数,所以这不是一个好的答案......
0赞
Suhas_Pote
6/19/2019
#3
这是一个简单的函数,您可以通过传递数据帧和阈值来直接使用
df
'''
pets location owner id
0 cat San_Diego Champ 123.0
1 dog NaN Ron NaN
2 cat NaN Brick NaN
3 monkey NaN Champ NaN
4 monkey NaN Veronica NaN
5 dog NaN John NaN
'''
def rmissingvaluecol(dff,threshold):
l = []
l = list(dff.drop(dff.loc[:,list((100*(dff.isnull().sum()/len(dff.index))>=threshold))].columns, 1).columns.values)
print("# Columns having more than %s percent missing values:"%threshold,(dff.shape[1] - len(l)))
print("Columns:\n",list(set(list((dff.columns.values))) - set(l)))
return l
rmissingvaluecol(df,1) #Here threshold is 1% which means we are going to drop columns having more than 1% of missing values
#output
'''
# Columns having more than 1 percent missing values: 2
Columns:
['id', 'location']
'''
现在创建不包括这些列的新数据框
l = rmissingvaluecol(df,1)
df1 = df[l]
PS:您可以根据需要更改阈值
奖励步骤
您可以找到每列缺失值的百分比(可选)
def missing(dff):
print (round((dff.isnull().sum() * 100/ len(dff)),2).sort_values(ascending=False))
missing(df)
#output
'''
id 83.33
location 83.33
owner 0.00
pets 0.00
dtype: float64
'''
评论
1赞
smci
9/10/2019
这个答案不如df.dropna(..., thresh)
实现这个,我们只需要计算出正确的值。而且您不需要创建任何新的 DataFrame,只需创建 .df.dropna(..., inplace=True)
2赞
Achintha Ihalage
5/13/2021
#4
另一种解决方案是在非 null 位置创建一个具有 True 值的布尔数据帧,然后获取至少具有一个 True 值的列。这将删除具有所有 NaN 值的列。
df = df.loc[:,df.notna().any(axis=0)]
如果要删除至少缺少一个 (NaN) 值的列;
df = df.loc[:,df.notna().all(axis=0)]
此方法在删除包含空字符串、零或基本上任何给定值的列时特别有用。例如;
df = df.loc[:,(df!='').all(axis=0)]
删除至少包含一个空字符串的列。
评论