Pandas 清洗格式错误的数据
格式错误的数据
格式错误的值会使分析数据变得困难,甚至不可能。
要解决此问题,有两个选择:删除行,或将列中的所有单元格转换为相同格式。
转换成正确的格式
在我们的 DataFrame 中,我们有两个格式错误的值。查看第 22 行和第 26 行,"Date" 列应为表示日期的字符串:
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
让我们尝试将 "Date" 列中的所有值转换为日期。
Pandas 对此有一个 to_datetime() 方法:
实例
转换为日期:
import pandas as pddf = pd.read_csv('data.csv')df['Date'] = pd.to_datetime(df['Date'])print(df.to_string())
结果:
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 NaT 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 '2020/12/26' 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
从结果中可以看出,第 26 行中的日期已经被修正,但第 22 行中的空日期得到了一个 NaT(不是时间)值,换句话说它是一个空值。处理空值的一种方法是删除整行。
删除行
上面示例中的转换结果为我们提供了一个 NaT 值的结果,该值可以作为空值处理,我们可以使用 dropna() 方法删除该行。
实例
在 "Date" 列中删除具有空值的行:
import pandas as pddf = pd.read_csv('data.csv')df['Date'] = pd.to_datetime(df['Date'])df.dropna(subset=['Date'], inplace = True)print(df.to_string())