Pandas 处理错误数据

有时,数据集可能包含不准确的条目,原因包括数据输入时的人为错误、从不可靠来源获取数据等。

这会严重影响对数据进行的分析的质量和可靠性。

我们来看一个包含一所全男生小学学生数据的 DataFrame。

      Name  Age Gender  Standard
0     John    8      M         3
1  Michael    9      M         4
2      Tom    7      M        12
3     Alex   80      F         3
4     Ryan  100      M         5

在上面的 DataFrame 中,我们可以看到一些明显的错误,例如:

  • 两名学生的年龄被列为 **80** 和 **100**,这对于小学生来说太大了。
  • **Alex** 的性别被标记为 **F**。由于这是一所全男生学校,这显然是一个错误。
  • **Tom** 被列为 12 年级,这在小学环境中是不可能的。

我们可以通过以下方式处理这些错误数据:

  1. 替换单个值
  2. 根据条件替换值
  3. 删除错误值

替换单个值

我们可以看到 `Gender` 列中的 **F** 值是一个明显的错误。让我们将 **F** 替换为 **M** 来纠正这个错误。

import pandas as pd

# create dataframe
data = {
    'Name': ['John', 'Michael', 'Tom', 'Alex', 'Ryan'],
    'Age': [8, 9, 7, 80, 100],
    'Gender': ['M', 'M', 'M', 'F', 'M'],
    'Standard': [3, 4, 12, 3, 5]
}
df = pd.DataFrame(data)

# replace F with M df.loc[3, 'Gender'] = 'M'
print(df)

输出

      Name  Age Gender  Standard
0     John    8      M         3
1  Michael    9      M         4
2      Tom    7      M        12
3     Alex   80      M         3
4     Ryan  100      M         5

在这个例子中,我们使用 `df.loc[]` 将错误值替换为正确值。

虽然这种方法对于小型数据集很有效,但随着数据集的增长,它会变得很麻烦。


根据条件替换值

在需要满足特定条件的情况下,我们可以遍历值来检查条件是否满足并进行相应的更改。

例如,这所小学学生的最高年龄是 **14** 岁。但有两个学生的年龄是 **80** 和 **100** 岁。这看起来像是一个多输入了一个零的笔误。

让我们来修复这个错误。

import pandas as pd

# create dataframe
data = {
    'Name': ['John', 'Michael', 'Tom', 'Alex', 'Ryan'],
    'Age': [8, 9, 7, 80, 100],
    'Gender': ['M', 'M', 'M', 'M', 'M'],
    'Standard': [3, 4, 12, 3, 5]
}
df = pd.DataFrame(data)

# replace values based on conditions for i in df.index: age_val = df.loc[i, 'Age'] if (age_val > 14) and (age_val%10 == 0): df.loc[i, 'Age'] = age_val/10
print(df)

输出

      Name  Age Gender  Standard
0     John    8      M         3
1  Michael    9      M         4
2      Tom    7      M        12
3     Alex    8      M         3
4     Ryan   10      M         5

在上面的例子中,我们将年龄大于 **14** 且是 **10** 的倍数的值,通过从原始值中删除一个零来替换。

我们检查年龄是否是 **10** 的倍数,因为年龄较大且是 **10** 的倍数很可能是笔误。


删除错误值

有些值无法纠正。例如,`Standard` 列中的 **12** 值是没有意义的,因为这是一所小学。但我们也无法纠正它,因为我们不知道正确的年级。

所以我们需要删除包含此类值的整行或任何其他行。

import pandas as pd

# create dataframe
data = {
    'Name': ['John', 'Michael', 'Tom', 'Alex', 'Ryan'],
    'Age': [8, 9, 7, 8, 10],
    'Gender': ['M', 'M', 'M', 'M', 'M'],
    'Standard': [3, 4, 12, 3, 5]
}
df = pd.DataFrame(data)

# remove mistaken values for i in df.index: if df.loc[i,'Standard'] > 8: df.drop(i, inplace=True)
print(df)

输出

      Name  Age Gender  Standard
0     John    8      M         3
1  Michael    9      M         4
3     Alex    8      M         3
4     Ryan   10      M         5

在这个例子中,我们删除了 `Standard` 列中值大于 **8** 的行。

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战