思路
- 遍历所有列名,构造一个列名到列内
NaN
数目的映射字典。 - 找到字典中最大的值。
- 遍历字典,如果值等于最大值,则删除对应列。
思路很简单,但是在获取计数这一步出了问题。
使用 value_counts()
函数可以很方便地对值进行计数。但获取某一个具体值的计数,要以其值作为键来访问。我尝试使用各种大小写的 NaN
字符串都报键错误。最后想到看一下键的类型:Float64Index([nan, 2.0, 4.0], dtype='float64')
,然后用 float('nan')
作为键去访问,这次没有报错。
代码
# 删除缺失值最多的列
def drop_na(data_to_process: DataFrame):
keys2cnt_na = {}
na = float('nan')
for key in data_to_process.keys():
cnt = data_to_process[key].value_counts(dropna=False)
if na not in cnt:
keys2cnt_na[key] = 0
else:
keys2cnt_na[key] = cnt[na]
max_num = max(keys2cnt_na.values())
for key, value in keys2cnt_na.items():
if value == max_num:
return data_to_process.drop(labels=[key], axis=1)
return data_to_process
Comments NOTHING