首页 > 解决方案 > 为 pandas 中的不同列以不同方式填充缺失值

问题描述

假设我有一个包含不同类型列的数据框 - 数字和分类。我想填写数字列的中值和分类的随机值。

到目前为止,这就是我正在做的事情:

def fill_nulls(df, num_cols, cat_cols):    
    for col in num_cols:
            dic[col] = 'median'
    for col in cat_cols:
            dic[col] = lambda x: x.sample(1)

    df = df.apply(dic) #NOT SURE WHAT MUST BE HERE

我正在创建一个字典,为每一列指定所需的方法。但是现在我不确定如何使这项工作适用于缺失值。我相信它应该是这样的apply(dic),但我不确定如何使它仅适用于缺失值。

谢谢!

编辑:

我目前在做什么:

for col in cat_cols:
    bools = pd.notnull(df[col])
    notnulls = df[col][bools]
    sample = notnulls.sample(1)
    sample = sample.tolist()[0]
    df[col] = df[col].fillna(value=sample)

for col in num_cols:
    med = df[col].median()
    print(type(med))
    df[col] = df[col].fillna(value=med)

这可能不是最有效的方法。因此,如果有人知道更好的方法,那就太好了!谢谢!

标签: pythonpandas

解决方案


我在这里假设您的数据仅包含数字和分类列(没有日期时间列)。为了演示,首先设置一些示例数据:

import numpy as np
import pandas as pd

df = pd.DataFrame({0: ["0:00", np.nan, "12:00", np.nan, "06:00"],
                  1: [np.nan, 4, 12, 2, np.nan],
                  2: [100, 2, np.nan, -3.6, np.nan],
                  3: ["a", "b", "a", np.nan, np.nan]})
df
    0       1     2     3
0   0:00    NaN   100.0 a
1   NaN     4.0   2.0   b
2   12:00   12.0  NaN   a
3   NaN     2.0   -3.6  NaN
4   06:00   NaN   NaN   NaN

现在,根据您的要求填写缺失值:

# Fill numeric types with median
df = df.fillna(df.median())

# Fill rest of columns (categorical) with random value
df.apply(lambda x: x.fillna(np.random.choice(x[~x.isnull()])))

df
    0       1     2     3
0   0:00    4.0   100.0 a
1   0:00    4.0   2.0   b
2   12:00   12.0  2.0   a
3   0:00    2.0   -3.6  a
4   06:00   4.0   2.0   a

推荐阅读