pandas 删除缺失值最多的列

发布于 2023-02-15  136 次阅读


思路

  1. 遍历所有列名,构造一个列名到列内 NaN 数目的映射字典。
  2. 找到字典中最大的值。
  3. 遍历字典,如果值等于最大值,则删除对应列。

思路很简单,但是在获取计数这一步出了问题。

使用 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