评估数据
- 结构方面
- 需要清理:乱数据
- 不需要清理:整洁数据
- 每列是一个变量
- 每行是一个观察值
- 每个单元格是一个值
- 内容方面
- 需要清理:脏数据
- 丢失数据
- 重复数据
- 不一致数据
- 无效或错误数据
- 不需要清理:干净数据
- 需要清理:脏数据
# 获取整体信息
df.info()
# 获取开头/结尾/随机数据来评估
df.head(10)
df.tail(10)
df.sample(10)
# 调整展示上限
pd.set_option("display.max_columns", 150)
pd.set_option("display.max_colwidth", 500)
# 评估丢失数据
# 返回布尔值组成的Series或DataFrame
scores["考试2"].isnull()
df.isnull()
# 获取空缺值数量
scores["考试2"].isnull().sum()
df.isnull().sum()
# 提取丢失数据的行
scores[scores["考试2"].isnull()]
# 评估重复数据
students["学号"].duplicated()
students.duplicated(subset=["学号","性别"])
# 评估不一致数据
students["班级"].value_counts()
# 评估无效/错误数据
# 排序
students["身高"].sort_values()
students.describe()
清洗数据
-
结构方面:更改为整洁数据结构
-
内容方面
- 丢失数据
- 人工填入缺失值
- 不处理缺失值
- 把有缺失值的行删除
- 用例如平均数等填充代替缺失值
- 重复数据:删除
- 不一致数据:统一
- 无效数据:删除或替换
- 数据类型转换
- 丢失数据
-
实际操作
# 重命名索引和列名(原变量不变,需要重新赋值或可选参数inplace=True
df1.rename(index={"2_":"2", "_5":"5", "6*":"6"})
df1.rename(columns={"2_":"2", "_5":"5", "6*":"6"})
df2.rename(index=某函数/方法)
df2.rename(columns=str.upper) # 大写
# 更多Series相关方法:https://pandas.pydata.org/docs/reference/api/pandas.Series.html
# 更多DataFrame相关方法:https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html
# 重设索引
# 将列值作为索引
df3.set_index("Salesperson")
# 还原
df3.reset_index()
# 对索引和列名重新排序(原变量不变,需要重新赋值或可选参数inplace=True
df4.sort_index()
# 对数据进行转置
df1 = df1.T
# 对列进行拆分
df2[["人口", "面积"]] = df2["人口密度"].str.split("/", expand=True)
df2 = df2.drop("人口密度", axis=1)
# 把不同列合并成一列
df3["姓].str.cat(df3["名"], sep="-")
# 把宽数据转换成长数据(列名变成列值)
df4 = pf.melt(df4, id_vars=['不变的列名'], var_name='列名所在列列名', value_name='原列值所在列列名')
# 对行进行拆分
df5.explode("课程列表")
# 删除行,删除列(原变量不变,需要重新赋值或可选参数inplace=True
df6.drop(2)
df6.drop(["列","lie"],axis=1)
# 对整列缺失值进行填充(索引定位)
df1["国家"] = "中国"
# 对某个缺失值进行填充
df2.loc["003":"004", "销售额"] = 800
# 自动找到缺失值进行填充
df4["B"].fillna(df["B"].mean())
df4.fillna(0)
df4.fillna({'A': 0, 'B': 10}) # 不同列可指定替换值
# 删除存在缺失值的行(原变量不变,需要重新赋值或可选参数inplace=True
df5.dropna()
df5.dropna(subset=["工资"]) # 控制范围
# 删除重复数据(原变量不变,需要重新赋值或可选参数inplace=True
df6["姓名"].drop_duplicates()
df6.drop_duplicates(subset=['a','b'], keep='last') #同时重复,保留最后
# 对值进行替换(不一致数据)(原变量不变,需要重新赋值或可选参数inplace=True
df7.replace(["hnu", "湖大"], "湖南大学")
df7.replace("hnu": "湖南大学")
# 对值的类型进行转换
# 分类数据建议转换为category,有利于减小内存,让Pandas自动选用合适的统计方法或图表类型
s1=pd.Series(["1","2","3"])
s1.astype("category")
保存数据(覆盖原始数据)
df1.to_csv("cleaned_sales_data.csv")
# 读取时会将索引作为第一列,需要更改列名并将其重新设置为索引
# 写入时忽略索引(索引无关键信息)
df1.to_csv("cleaned_sales_data2.csv", index=False)