有时,数据集可能包含不准确的条目,原因包括数据输入时的人为错误、从不可靠来源获取数据等。
这会严重影响对数据进行的分析的质量和可靠性。
我们来看一个包含一所全男生小学学生数据的 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 年级,这在小学环境中是不可能的。
我们可以通过以下方式处理这些错误数据:
- 替换单个值
- 根据条件替换值
- 删除错误值
替换单个值
我们可以看到 `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** 的行。