Pandas 修正错误数据
错误数据
"错误数据" 不是 "空值" 或者 "格式错误", 它只是错了, 就像有人将 "1.99" 时注册成了 "199"
有时,您可以通过查看数据集来发现错误的数据,因为您知道这个数据集应该是什么样的。
如果您查看我们的数据集,您可以看到在第 7 行中,duration 是 450,但对于所有其他行,duration 都在 30 到 60 之间。
这不一定是错的,但考虑到这是某人训练的数据集,我们得出结论,此人在 450 分钟内没有锻炼。
我们如何修正错误的值,比如在第7排的 "duration" 值
Duration Date Pulse Maxpulse Calories0 60 '2020/12/01' 110 130 409.11 60 '2020/12/02' 117 145 479.02 60 '2020/12/03' 103 135 340.03 45 '2020/12/04' 109 175 282.44 45 '2020/12/05' 117 148 406.05 60 '2020/12/06' 102 127 300.06 60 '2020/12/07' 110 136 374.07 450 '2020/12/08' 104 134 253.38 30 '2020/12/09' 109 133 195.19 60 '2020/12/10' 98 124 269.010 60 '2020/12/11' 103 147 329.311 60 '2020/12/12' 100 120 250.712 60 '2020/12/12' 100 120 250.713 60 '2020/12/13' 106 128 345.314 60 '2020/12/14' 104 132 379.315 60 '2020/12/15' 98 123 275.016 60 '2020/12/16' 98 120 215.217 60 '2020/12/17' 100 120 300.018 45 '2020/12/18' 90 112 NaN19 60 '2020/12/19' 103 123 323.020 45 '2020/12/20' 97 125 243.021 60 '2020/12/21' 108 131 364.222 45 NaN 100 119 282.023 60 '2020/12/23' 130 101 300.024 45 '2020/12/24' 105 132 246.025 60 '2020/12/25' 102 126 334.526 60 20201226 100 120 250.027 60 '2020/12/27' 92 118 241.028 60 '2020/12/28' 103 132 NaN29 60 '2020/12/29' 100 132 280.030 60 '2020/12/30' 102 129 380.331 60 '2020/12/31' 92 115 243.0
替换值
修复错误值的一种方法是用其他值替换它们。
在我们的示例中,它很可能是一个输入错误,值应该是 "45" 而不是 "450",我们可以在第 7 行插入一个 "45":
实例
将第 7 行的 "Duration" 设置称为 45:
import pandas as pddf = pd.read_csv('data.csv')df.loc[7,'Duration'] = 45print(df.to_string())
对于小数据集,您可能可以逐个替换错误的数据,但对于大数据集则不行。
要为较大的数据集替换错误的数据,您可以创建一些规则,例如为合法值设置一些边界,并替换边界之外的任何值。
实例
循环遍历 "Duration" 列中的所有值
如果该值高于 120,则将其设置为 120:
import pandas as pddf = pd.read_csv('data.csv')for x in df.index:if df.loc[x, "Duration"] > 120:df.loc[x, "Duration"] = 120print(df.to_string())
删除行
处理错误数据的另一种方法是删除包含错误数据的行。
这样,您就不必找出要用什么替换它们,而且您很有可能不需要它们来进行分析。
实例
删除 "Duration" 列的值高于 120 的行:
import pandas as pddf = pd.read_csv('data.csv')for x in df.index:if df.loc[x, "Duration"] > 120:df.drop(x, inplace = True)#请记住包含 "inplace=True" 参数,以便在原始 DataFrame 对象中进行更改,而不是返回副本print(df.to_string())