定义在 pandas 数据框中填充 NaN 的策略?

Posted

技术标签:

【中文标题】定义在 pandas 数据框中填充 NaN 的策略?【英文标题】:Define a strategy of filling NaNs in pandas dataframe? 【发布时间】:2022-01-20 22:34:21 【问题描述】:

我有一个混合类型的数据框 - 字符串、浮点数、整数、布尔值。

pd.DataFrame('a': [6.6, -5.2, 2.1, float('NaN'), float('NaN')],
              'b': ['a', 'a', 'NaN', 'b', 'NaN'],
              'c': [True, True, False, float('NaN'), float('NaN')],
              'd': [1,2,3,None, None])

这些列中的大多数都有一些 NaN。 我想根据一些自定义规则来估算缺失值: 对于每个浮点类型列 - 取该列的中值并估算。 对于每个字符串列 - 采用模式和估算。 对于每个整数列 - 取中位数、ceil 和 impute。 对于每个 bool 列 - 用 False 估算缺失值。

这就是我到目前为止所做的:

fill_na_policy = 'float64': np.median(),
                  'int': np.ceil(np.median()),
                  'string': scipy.stats.mode(),
                  'bool': False
df.fillna(df.dtypes.replace(fill_na_policy), inplace=True)

请告知如何使其工作,或者我应该为每种类型创建 lambda 函数?

【问题讨论】:

【参考方案1】:

您可以使用 select_dtypes 区分和选择不同类型的列,并使用您希望数据帧的每个单独部分的技术进行估算。考虑下面的例子:

# Select numeric columns
f = df.select_dtypes('float64')
i = df.select_dtypes('int64')

# Select string and boolean columns
o = df.select_dtypes('object')
b = df.select_dtypes(include='bool')

# Fill numeric
df[f.columns] = f.fillna(f.median())
df[i.columns] = i.fillna(np.ceil(np.median(i)))

# Fill object
df[o.columns] = o.fillna(o.agg(lambda x: x.mode().values[0]))
df[b.columns] = b.fillna(False)

这会给你:

     a  b      c    d
0  6.6  a   True  1.0
1 -5.2  a   True  2.0
2  2.1  a  False  3.0
3  2.1  b   True  2.0
4  2.1  a   True  2.0

【讨论】:

【参考方案2】:

为各种数据类型创建一个系列:

# create more variables depending on the dtype
floats = df.select_dtypes(float).median()
strings = df.select_dtypes('object').mode().stack().droplevel(0)
fill_vals = pd.concat([floats, strings])

现在填充数据框(列是fill_vals中的索引,每个对应列的值将被替换):

df.fillna(fill_vals)

【讨论】:

以上是关于定义在 pandas 数据框中填充 NaN 的策略?的主要内容,如果未能解决你的问题,请参考以下文章

合并 Pandas 数据框中的 2 列,用前一个值填充 NaN [重复]

用 pandas 数据框中另一列的值填充多列中的 Na

将定义集中的值设置为 Pandas 数据框中列的给定值(f.e. NaN)

Pandas基础教程

在 pandas 数据框中检索 NaN 值的索引

计算 Pandas 数据框中 np.nan 的数量