当前位置: 首页 > 知识库问答 >
问题:

Python:如何用中位数替换缺少的列值

窦彦君
2023-03-14

我有一个如下的数据帧

df = pd.DataFrame({'A': [1, 2, 3], 'B': [1.45, 2.33, np.nan], 'C': [4, 5, 6], 'D': [4.55, 7.36, np.nan]}) 

我想以通用方式替换缺少的值,即np.nan。为此,我创建了一个函数,如下所示

def treat_mis_value_nu(df):
    df_nu = df.select_dtypes(include=['number'])
    lst_null_col = df_nu.columns[df_nu.isnull().any()].tolist()
        if len(lst_null_col)>0:
            for i in lst_null_col:
                if df_nu[i].isnull().sum()/len(df_nu[i])>0.10:
                    df_final_nu = df_nu.drop([i],axis=1)
                else:
                    df_final_nu = df_nu[i].fillna(df_nu[i].median(),inplace=True)
    return df_final_nu

当我应用这个函数时,如下所示

df_final = treat_mis_value_nu(df)

我得到的数据帧如下

    A    B  C
 0  1  1.0  4
 1  2  2.0  5
 2  3  NaN  6

因此,它实际上正确地删除了列D,但未能删除列B。我知道过去有关于这个话题的讨论(这里)。我还是可能错过了什么?

共有2个答案

齐望
2023-03-14

我建议看一下sklearn输入转换器。我不认为它可以删除列,但它可以用一种“通用方式”明确地填充它们——例如,用相关列的中位数填充缺少的值。

您可以这样使用它:

from sklearn.preprocessing import Imputer

imputer = Imputer(strategy='median')

num_df = df.values
names = df.columns.values

df_final = pd.DataFrame(imputer.transform(num_df), columns=names)

如果您有额外的转换,您可以考虑制作转换管道,甚至可以制作自己的变压器来完成定制任务。

胡鸿羲
2023-03-14

使用:

df = pd.DataFrame({'A': [1, 2, 3,5,7], 'B': [1.45, 2.33, np.nan, np.nan, np.nan], 
                   'C': [4, 5, 6,8,7], 'D': [4.55, 7.36, np.nan,9,10],
                   'E':list('abcde')}) 
print (df)
   A     B  C      D  E
0  1  1.45  4   4.55  a
1  2  2.33  5   7.36  b
2  3   NaN  6    NaN  c
3  5   NaN  8   9.00  d
4  7   NaN  7  10.00  e

def treat_mis_value_nu(df):
    #get only numeric columns to dataframe
    df_nu = df.select_dtypes(include=['number'])
    #get only columns with NaNs
    df_nu = df_nu.loc[:, df_nu.isnull().any()]
    #get columns for remove with mean instead sum/len, it is same
    cols_to_drop = df_nu.columns[df_nu.isnull().mean() <= 0.30]
    #replace missing values of original columns and remove above thresh    
    return df.fillna(df_nu.median()).drop(cols_to_drop, axis=1)

print (treat_mis_value_nu(df))
   A  C      D  E
0  1  4   4.55  a
1  2  5   7.36  b
2  3  6   8.18  c
3  5  8   9.00  d
4  7  7  10.00  e
 类似资料:
  • 我有一个数据集,包含一系列国家和年份的几个指标的值(3072,1134行和列),但有些NaN。 下面是数据集的示例: 我想根据提交的

  • 我有一个85列的大数据框。丢失的数据已编码为。我的目标是获得每列中缺少的数据量。所以我写了一个for循环来创建一个列表来获取金额。但它不起作用。 以下是我的代码: 我尝试使用循环中的代码,通过将更改为某一列的名称,来生成该列缺少的值的数量,然后代码运行并给出该列缺少的数据的数量。 因此,我不知道如何更正for循环代码。有人能帮我吗?我非常感谢你的帮助。

  • 问题内容: 我有一个列表,我想用condition()返回True的None替换值。 例如,如果条件检查bool(item%2)应该返回: 最有效的方法是什么? 问题答案: 使用列表理解来构建新列表: 您可以根据需要修改原始列表,但实际上并不能节省时间: 以下是(Python 3.6.3)演示非节省时间的时间: 和Python 2.7.6计时:

  • 问题内容: 就像这样说: http://web.archive.org/web/20090624083829/http://mail.python.org/pipermail/python- list/2003-May/206149.html Python中不存在函数重载。 就我而言,这也是一种面向对象的语言,因此对我来说是一个很大的障碍。最初,我发现无法区分参数类型很困难,但是Python的动态

  • 我的数据帧中有一个值列表,我想用空字符串替换NaN值。 到目前为止,我所尝试的都不起作用:

  • 我一直在尝试通过FieldMailMerge和VariableReplace示例,但似乎无法运行本地测试用例。我基本上试图从一个docx模板文档开始,并让它从一个模板创建x个docx文档,替换变量。 在下面的代码中,试图替换单个变量,但失败了。模板文件中的${}值作为处理的一部分被移除,因此我认为它正在查找它们,而不是出于某种原因替换它们。我明白这可能是由于格式问题,正如示例代码的注释中所解释的那