python pandas数据清洗
一、介绍:
2024金砖python样题中数据清洗部分代码实现
二、任务要求:
数据集中有购药时间、社保卡号、商品编码、商品名称、销售数
量、应收金额、实收金额几个字段,请你使用 NumPy 和 Pandas 按如
下要求对数据进行清洗:
1.购药时间就是销售时间,为了后续分析更好的理解字段,将"
购药时间"改为"销售时间";
2.任何一条数据中只要有一个缺失值就删除该条数据;
3.将销售数量、应收金额、实收金额三列的数据类型转换为float64;
4.销售时间中包含日期和星期几,要求数据最终只保留日期,并
把销售日期从字符串类型转换为日期数据类型;
5.转换日期过程中不符合日期格式的数值会被转换为空值,需要
删除列(销售时间,社保卡号)中为空的行;
6.按销售日期进行升序排列,排序后的索引已被打乱,需要修改
成从 0 到 N 按顺序的索引值;
7.将有异常值(如销售数量、应付金额、实付金额为负数)的数
据进行删除。
8.将清洗后的数据保存为 CSV 文件。
三、代码部分:
1.购药时间就是销售时间,为了后续分析更好的理解字段,将"
购药时间"改为"销售时间";
import pandas as pd# 打开数据集
df = pd.read_excel('药品销售数据集.xlsx', engine='openpyxl')headers = df.columns.tolist()
headers = ['销售时间' if header == '购药日期' else header for header in headers]
# 重命名列
df.rename(columns={'购药日期': '销售日期'}, inplace=True)
2.任何一条数据中只要有一个缺失值就删除该条数据;
# 删除包含任何缺失值的行
df = df.dropna()
3.将销售数量、应收金额、实收金额三列的数据类型转换为float64;
# 转换数据类型
df['销售数量'] = df['销售数量'].astype('float64')
df['应收金额'] = df['应收金额'].astype('float64')
df['实收金额'] = df['实收金额'].astype('float64')
4.销售时间中包含日期和星期几,要求数据最终只保留日期,并
把销售日期从字符串类型转换为日期数据类型;
# 提取日期部分并转换为日期数据类型
df['销售日期'] = pd.to_datetime(df['销售日期'].str.split(' ').str[0])
5.转换日期过程中不符合日期格式的数值会被转换为空值,需要
删除列(销售时间,社保卡号)中为空的行;
# 删除包含空值的行
df = df.dropna(subset=['销售日期', '社保卡号'])
print("处理后的数据:")
print(df)
print("\n销售日期的数据类型:", df['销售日期'].dtype)
6.按销售日期进行升序排列,排序后的索引已被打乱,需要修改
成从 0 到 N 按顺序的索引值;
# 按销售日期升序排列
df = df.sort_values(by='销售日期')
# 重置索引
df.reset_index(drop=True, inplace=True)
print("处理后的数据:")
print(df)
print("\n销售日期的数据类型:", df['销售日期'].dtype)
7.将有异常值(如销售数量、应付金额、实付金额为负数)的数
据进行删除。
# 删除异常值:销售数量、应收金额和实收金额为负值的行
df = df[(df['销售数量'] >= 0) & (df['应收金额'] >= 0) & (df['实收金额'] >= 0)]
# 按销售日期升序排列
df = df.sort_values(by='销售日期')
# 重置索引
df.reset_index(drop=True, inplace=True)
print("处理后的数据:")
print(df)
8.将清洗后的数据保存为 CSV 文件。
# 保存为 CSV 文件
df.to_csv('清洗后的数据.csv', index=False, encoding='utf-8-sig')
print("数据已保存为 '清洗后的数据.csv'")
完整代码:
import pandas as pd# 打开数据集
df = pd.read_excel('药品销售数据集.xlsx', engine='openpyxl')"""
1.购药时间就是销售时间,为了后续分析更好的理解字段,将"
购药时间"改为"销售时间";
"""
headers = df.columns.tolist()
headers = ['销售时间' if header == '购药日期' else header for header in headers]
# 重命名列
df.rename(columns={'购药日期': '销售日期'}, inplace=True)"""
2.任何一条数据中只要有一个缺失值就删除该条数据;
"""
# 删除包含任何缺失值的行
df = df.dropna()"""
3.将销售数量、应收金额、实收金额三列的数据类型转换为float64;
"""
# 转换数据类型
df['销售数量'] = df['销售数量'].astype('float64')
df['应收金额'] = df['应收金额'].astype('float64')
df['实收金额'] = df['实收金额'].astype('float64')"""
4.销售时间中包含日期和星期几,要求数据最终只保留日期,并
把销售日期从字符串类型转换为日期数据类型;
"""
# 提取日期部分并转换为日期数据类型
df['销售日期'] = pd.to_datetime(df['销售日期'].str.split(' ').str[0])"""
5.转换日期过程中不符合日期格式的数值会被转换为空值,需要
删除列(销售时间,社保卡号)中为空的行;
"""
# 删除包含空值的行
df = df.dropna(subset=['销售日期', '社保卡号'])
print("处理后的数据:")
print(df)
print("\n销售日期的数据类型:", df['销售日期'].dtype)"""
6.按销售日期进行升序排列,排序后的索引已被打乱,需要修改
成从 0 到 N 按顺序的索引值;
"""
# 按销售日期升序排列
df = df.sort_values(by='销售日期')
# 重置索引
df.reset_index(drop=True, inplace=True)
print("处理后的数据:")
print(df)
print("\n销售日期的数据类型:", df['销售日期'].dtype)"""
7.将有异常值(如销售数量、应付金额、实付金额为负数)的数
据进行删除。
"""
# 删除异常值:销售数量、应收金额和实收金额为负值的行
df = df[(df['销售数量'] >= 0) & (df['应收金额'] >= 0) & (df['实收金额'] >= 0)]
# 按销售日期升序排列
df = df.sort_values(by='销售日期')
# 重置索引
df.reset_index(drop=True, inplace=True)
print("处理后的数据:")
print(df)"""
8.将清洗后的数据保存为 CSV 文件。
"""
# 保存为 CSV 文件
df.to_csv('清洗后的数据.csv', index=False, encoding='utf-8-sig')
print("数据已保存为 '清洗后的数据.csv'")