1、数据清理(Data Cleaning)
数据清理(Data Cleaning) 是数据分析中最关键的步骤之一,它指的是识别并修复数据集中存在的“错误数据”或“不一致数据”,以提高数据质量,确保分析结果的准确性。
常见的数据错误类型,如下表,
错误类型 | 描述说明 |
---|---|
空单元格 | 某些值缺失(NaN) |
数据格式错误 | 如日期、数字、字符串类型不一致 |
数据内容错误 | 如性别列出现拼写错误(如 "Malee") |
重复数据 | 多行数据完全重复,影响统计分析 |
数据清理是指修复数据集中的错误信息,包括处理空单元格、格式错误、错误数据和重复项等问题。通过数据清理,可以提高数据的准确性和一致性,是数据分析和建模前的重要准备工作。
2、示例数据集
示例数据集:
Duration Date Number Count Calories 0 60 '2020/12/01' 110 130 409.1 1 60 '2020/12/02' 117 145 479.0 2 60 '2020/12/03' 103 135 340.0 3 45 '2020/12/04' 109 175 282.4 4 45 '2020/12/05' 117 148 406.0 5 60 '2020/12/06' 102 127 300.0 6 60 '2020/12/07' 110 136 374.0 7 450 '2020/12/08' 104 134 253.3 8 30 '2020/12/09' 109 133 195.1 9 60 '2020/12/10' 98 124 269.0 10 60 '2020/12/11' 103 147 329.3 11 60 '2020/12/12' 100 120 250.7 12 60 '2020/12/12' 100 120 250.7 13 60 '2020/12/13' 106 128 345.3 14 60 '2020/12/14' 104 132 379.3 15 60 '2020/12/15' 98 123 275.0 16 60 '2020/12/16' 98 120 215.2 17 60 '2020/12/17' 100 120 300.0 18 45 '2020/12/18' 90 112 NaN 19 60 '2020/12/19' 103 123 323.0 20 45 '2020/12/20' 97 125 243.0 21 60 '2020/12/21' 108 131 364.2 22 45 NaN 100 119 282.0 23 60 '2020/12/23' 130 101 300.0 24 45 '2020/12/24' 105 132 246.0 25 60 '2020/12/25' 102 126 334.5 26 60 '2020/12/26' 100 120 250.0 27 60 '2020/12/27' 92 118 241.0 28 60 '2020/12/28' 103 132 NaN 29 60 '2020/12/29' 100 132 280.0 30 60 '2020/12/30' 102 129 380.3 31 60 '2020/12/31' 92 115 243.0
数据集包含一些空单元格 (22行中"Date"列, 及18和28行中"Calories"列)。
数据集包含错误的格式 (26行中"Date"列)。
数据集包含错误的数据 (7行中"Duration"列)。
数据集包含重复数据 ( 11和12行)。
3、Pandas 清洗空值
如要删除包含空字段的行,可以使用 dropna()
。还可以使用 fillna()
方法来替换一些空字段
import pandas as pd import numpy as np data = { 'Duration': [60, 60, 60, 45, 45, 60, 60, 450, 30, 60], 'Date': ['2020/12/01', '2020/12/02', '2020/12/03', '2020/12/04', '2020/12/05', '2020/12/06', '2020/12/07', '2020/12/08', '2020/12/09', np.nan], 'Number': [110, 117, 103, 109, 117, 102, 110, 104, 109, 130], 'Count': [130, 145, 135, 175, 148, 127, 136, 134, 133, 101], 'Calories': [409.1, 479.0, 340.0, 282.4, 406.0, 300.0, 374.0, 253.3, 195.1, np.nan] } df = pd.DataFrame(data) # 检查缺失值,返回布尔型DataFrame print(df.isnull()) # 每列缺失值数量 print(df.isnull().sum()) # 删除含缺失值的行 print(df.dropna()) # 用 0 填充所有缺失值 print(df.fillna(0)) # 用均值填充某列缺失值 print(df['Calories'].fillna(df['Calories'].mean()))
参考文档:
Python pandas.DataFrame.dropna函数方法的使用
Python pandas.DataFrame.fillna函数方法的使用
1)删除包含空数据的行
import pandas as pd df = pd.read_csv('data.csv') # 默认情况下,dropna() 方法返回一个新的 DataFrame,不会修改源数据。 # 如需要修改源数据,则需要使用df.dropna(inplace = True) new_df = df.dropna() print(new_df.to_string())
输出结果:
Duration Date Number Count Calories 0 60 '2020/12/01' 110 130 409.1 1 60 '2020/12/02' 117 145 479.0 2 60 '2020/12/03' 103 135 340.0 3 45 '2020/12/04' 109 175 282.4 4 45 '2020/12/05' 117 148 406.0 5 60 '2020/12/06' 102 127 300.0 6 60 '2020/12/07' 110 136 374.0 7 450 '2020/12/08' 104 134 253.3 8 30 '2020/12/09' 109 133 195.1 9 60 '2020/12/10' 98 124 269.0 10 60 '2020/12/11' 103 147 329.3 11 60 '2020/12/12' 100 120 250.7 12 60 '2020/12/12' 100 120 250.7 13 60 '2020/12/13' 106 128 345.3 14 60 '2020/12/14' 104 132 379.3 15 60 '2020/12/15' 98 123 275.0 16 60 '2020/12/16' 98 120 215.2 17 60 '2020/12/17' 100 120 300.0 18 60 '2020/12/19' 103 123 323.0 19 45 '2020/12/20' 97 125 243.0 20 60 '2020/12/21' 108 131 364.2 21 60 '2020/12/23' 130 101 300.0 22 45 '2020/12/24' 105 132 246.0 23 60 '2020/12/25' 102 126 334.5 24 60 '2020/12/26' 100 120 250.0 25 60 '2020/12/27' 92 118 241.0 26 60 '2020/12/29' 100 132 280.0 27 60 '2020/12/30' 102 129 380.3 28 60 '2020/12/31' 92 115 243.0
2)移除指定列有空值的行
import pandas as pd df = pd.read_csv('data.csv') df.dropna(subset=['Calories'], inplace = True) print(df.to_string())
输出结果:
Duration Date Number Count Calories 0 60 '2020/12/01' 110 130 409.1 1 60 '2020/12/02' 117 145 479.0 2 60 '2020/12/03' 103 135 340.0 3 45 '2020/12/04' 109 175 282.4 4 45 '2020/12/05' 117 148 406.0 5 60 '2020/12/06' 102 127 300.0 6 60 '2020/12/07' 110 136 374.0 7 450 '2020/12/08' 104 134 253.3 8 30 '2020/12/09' 109 133 195.1 9 60 '2020/12/10' 98 124 269.0 10 60 '2020/12/11' 103 147 329.3 11 60 '2020/12/12' 100 120 250.7 12 60 '2020/12/12' 100 120 250.7 13 60 '2020/12/13' 106 128 345.3 14 60 '2020/12/14' 104 132 379.3 15 60 '2020/12/15' 98 123 275.0 16 60 '2020/12/16' 98 120 215.2 17 60 '2020/12/17' 100 120 300.0 18 60 '2020/12/19' 103 123 323.0 19 45 '2020/12/20' 97 125 243.0 20 60 '2020/12/21' 108 131 364.2 21 45 NaN 100 119 282.0 22 60 '2020/12/23' 130 101 300.0 23 45 '2020/12/24' 105 132 246.0 24 60 '2020/12/25' 102 126 334.5 25 60 '2020/12/26' 100 120 250.0 26 60 '2020/12/27' 92 118 241.0 27 60 '2020/12/29' 100 132 280.0 28 60 '2020/12/30' 102 129 380.3 29 60 '2020/12/31' 92 115 243.0
3)使用 0 替换空字段
import pandas as pd df = pd.read_csv('property-data.csv') # 默认情况下,fillna() 方法返回一个新的 DataFrame,不会修改源数据。 # 如需要修改源数据,则需要使用inplace = True df.fillna(0, inplace = True) print(df.to_string())
输出结果:
Duration Date Number Count Calories 0 60 '2020/12/01' 110 130 409.1 1 60 '2020/12/02' 117 145 479.0 2 60 '2020/12/03' 103 135 340.0 3 45 '2020/12/04' 109 175 282.4 4 45 '2020/12/05' 117 148 406.0 5 60 '2020/12/06' 102 127 300.0 6 60 '2020/12/07' 110 136 374.0 7 450 '2020/12/08' 104 134 253.3 8 30 '2020/12/09' 109 133 195.1 9 60 '2020/12/10' 98 124 269.0 10 60 '2020/12/11' 103 147 329.3 11 60 '2020/12/12' 100 120 250.7 12 60 '2020/12/12' 100 120 250.7 13 60 '2020/12/13' 106 128 345.3 14 60 '2020/12/14' 104 132 379.3 15 60 '2020/12/15' 98 123 275.0 16 60 '2020/12/16' 98 120 215.2 17 60 '2020/12/17' 100 120 300.0 18 45 '2020/12/18' 90 112 0 19 60 '2020/12/19' 103 123 323.0 20 45 '2020/12/20' 97 125 243.0 21 60 '2020/12/21' 108 131 364.2 22 45 0 100 119 282.0 23 60 '2020/12/23' 130 101 300.0 24 45 '2020/12/24' 105 132 246.0 25 60 '2020/12/25' 102 126 334.5 26 60 ‘2020/12/26’ 100 120 250.0 27 60 '2020/12/27' 92 118 241.0 28 60 '2020/12/28' 103 132 0 29 60 '2020/12/29' 100 132 280.0 30 60 '2020/12/30' 102 129 380.3 31 60 '2020/12/31' 92 115 243.0
4、Pandas 清洗格式错误数据
有数据格式错误的单元格,可以通过将空单元格的行,或者将列中的所有单元格转换为相同格式的数据。
import pandas as pd # 第三个日期格式错误 data = { "Date": ['2022/11/01', '2022/11/02' , '20221126'], "Count": [50, 40, 45] } df = pd.DataFrame(data, index = ["day1", "day2", "day3"]) df['Date'] = pd.to_datetime(df['Date']) print(df.to_string())
5、Pandas 清洗错误数据
对于错误数据的清洗,可以尝试对错误的数据进行替换或删除。
import pandas as pd data = { "name": ['Python', 'Java' , 'C'], "count": [1, 2, -1] # -1的数据是有问题 } df = pd.DataFrame(data) for x in df.index: if df.loc[x, "count"] < 0: df.drop(x, inplace = True) print(df.to_string())
6、Pandas 清洗重复数据
对重复数据的清洗,可以使用duplicated()
和 drop_duplicates()
。
相关文档:
Python pandas.DataFrame.duplicated函数方法的使用
Python pandas.DataFrame.drop_duplicates函数方法的使用
import pandas as pd data = { "name": ['Levi', 'Levi', 'Lynn', 'John'], "age": [30, 30, 20, 23] } df = pd.DataFrame(data) print(df.duplicated()) df.drop_duplicates(inplace = True) print(df)
7、重命名列名和替换值
重命名列名可以使用 rename(columns={...})
方法,将原始列名修改为更清晰或规范的名称;而通过 replace({...})
方法可对列中的特定值进行替换,这两种操作常用于数据清洗和格式标准化,提升数据的可读性与一致性。
import pandas as pd # 构造示例 DataFrame data = { 'Name': ['张三', '李四', '王五', '孙六'], 'gender': ['F', 'M', 'M', 'F'], 'score': [85, 90, 78, 92] } df = pd.DataFrame(data) print("原始数据:") print(df) # 重命名列 df.rename(columns={'Name': 'NewName'}, inplace=True) print(df) # 替换值 df['gender'].replace({'M': 'Male', 'F': 'Female'},inplace=True) print(df)