原文:
www.kdnuggets.com/2023/02/optimal-way-input-missing-data-pandas-fillna.html
图片由 catalyststuff 提供,来源于 Freepik
在数据探索阶段,我们经常会遇到缺失数据的变量。缺失数据可能由于各种原因存在;采样错误、故意遗漏或随机原因。无论原因是什么,我们需要分析缺失数据的原因。关于缺失数据类型的文章由 Yogita Kinha 提供,是一个很好的起点。
1. Google 网络安全证书 - 快速入门网络安全职业。
2. Google 数据分析专业证书 - 提升您的数据分析技能。
3. Google IT 支持专业证书 - 支持您组织的 IT 事务。
经过适当的分析,解决缺失数据问题的一种方法是填充数据。幸运的是,Pandas 允许轻松输入缺失数据。我们怎么做呢?填补缺失数据的最佳方式是什么?让我们一起学习。
根据 Pandas 的 文档,Fillna 是一个 Pandas 函数,用于用指定的方法填充 NA/NaN 值。在 Pandas DataFrame 中,我们将缺失的数据对象指定为 NaN 对象。使用 Fillna,我们将用我们分析过的其他值替换这些 NaN 值。
让我们试用一个数据集示例来尝试这个函数。本文将使用 Kaggle 上的地方性登革热训练数据集(许可证:CC0:公共领域)。
import pandas as pd
df = pd.read_csv('dengue_features_train.csv')
df.head(10)
正如我们在上述数据集中所看到的,‘ndvi_ne’ 列中存在缺失数据。使用 Pandas 的 fillna
函数,我们可以轻松地用其他值替换缺失数据。让我给你一个例子。
df.fillna(0).head(10)
使用fillna
函数,我们用值 0 替换了缺失的数据。使用fillna
函数时,你可以用任何值来替换它。例如,我用字符串‘zero’替换了缺失值。
df.fillna('zero').head(10)
或者我甚至可以使用函数来替换缺失值,这虽然可以做到,但并不实用。
df.fillna(pd.isna).head(10)
另外,fillna
函数在执行时不会改变实际的数据集。如果你希望 DataFrame 在执行函数时被替换,可以运行以下代码。
df.fillna(0, inplace = True)
当你运行上述代码时不会有输出,但你的 DataFrame 会受到影响。如果你还在实验数据中,请不要使用参数 inplace。
使用fillna
函数时必须小心。如果我们在整个 DataFrame 上运行该函数,它会用传入的值填充所有缺失的数据,即使这不是你的意图。通过使用数据示例来看看我在说什么。
df[df['ndvi_ne'].isna()]
我尝试获取所有‘ndvi_ne’列缺失的观察值。如果我们查看上面的输出,可以看到几个列也包含缺失数据。让我们尝试使用fillna
函数来填充它们。
df[df['ndvi_ne'].isna()].fillna('zero')
所有的缺失数据现在都被字符串‘zero’值替换了。通常,这不是我们想要的。如果我们只想替换某些列的缺失数据,我们可以在使用fillna
函数之前先选择这些列。
df['ndvi_ne'].fillna(0)
还有一种优化的方法来填充缺失数据,即通过传递一个包含列名作为键和替换值的字典。让我们通过代码示例来尝试一下。
df[df['ndvi_ne'].isna()].fillna({'ndvi_ne':0,
'ndvi_nw':'zero',
'ndvi_se': df['ndvi_se'].mean()})
使用上述代码,我们将列‘ndvi_ne’替换为 0,将‘ndvi_nw’替换为‘zero’,将‘ndvi_se’替换为列均值。其余部分未被修改,因为我们没有在函数中指定它们。
Pandas fillna
函数还允许用户指定要替换的缺失数据的数量。通过使用 limit 参数,我们可以连续填充到第 n 个缺失数据。让我们通过代码示例尝试一下。
df[df['ndvi_ne'].isna()].fillna(0, limit = 3).head()
从上述输出中,我们可以看到只有五行缺失数据中的三行被替换了。如果我们更改限制参数,可能会看到不同的结果。
df[df['ndvi_ne'].isna()].fillna(0 , limit = 2).head()
显示的数据中只有两行被替换。缺失数据不需要彼此相邻。它们可以在不同的行中,限制参数只会替换前两个缺失数据(如果限制参数设置为两)。
Pandas fillna
函数的优点在于,我们可以从前一个观测值或后续观测值中填充缺失数据。让我们尝试从前一个观测值中填充数据。提醒一下,我们在以下列中有缺失数据。
df['ndvi_ne'].head(10)
然后,我们将使用fillna
函数用前一行的数据替代缺失的数据。
df['ndvi_ne'].head(10).fillna(method = 'ffill')
缺失数据现在已被前一行的数据替代,或者我们可以称之为前向填充。让我们尝试反向操作:后向填充或从后续行填充缺失数据。
df['ndvi_ne'].head(10).fillna(method = 'bfill')
从上面的输出中,我们可以看到最后的数据仍然缺失。由于在缺失数据行之后没有任何观测值,函数将其保持原样。
前向填充和后向填充方法在知道前后数据仍然相关时非常有效,例如在时间序列数据中。假设股票数据;前一天的数据可能在第二天仍然适用。
缺失数据是数据预处理和探索中的典型情况。处理缺失数据的一种方法是用另一个值替代它。为此,我们可以使用名为fillna
的 Pandas 函数。使用该函数很简单,但有几种方法可以最佳地填充数据,包括在多个列中替换缺失数据、限制填充范围以及使用其他行填充数据。
Cornellius Yudha Wijaya 是一名数据科学助理经理和数据撰稿人。在全职工作于印尼安联期间,他喜欢通过社交媒体和写作媒体分享 Python 和数据技巧。