【数据操作与可视化】Pandas数据处理-数据预处理

59 阅读4分钟

【数据操作与可视化】Pandas数据处理-数据预处理

数据预处理工作通常包括以下几个方面:

  1. 缺失值处理
  2. 重复值处理
  3. 异常值处理
  4. 数据类型转换
  5. 索引设置
  • 缺失值处理
# 缺失值处理操作
df1 = pd.read_excel(r'缺失值处理.xlsx')
# 查找缺失值思路,先看数据集中各列有没有缺失值,再看缺失值所占比例。根据缺失值比例进行处理。
# 查看每列数据的缺失值总数
print(df1.isnull().sum())  
# 查看df中每列缺失值所占比例
df1.apply(lambda x: sum(x.isnull())/len(x), axis=0)
# 用dropna方法来删除包含空值的行
df1.dropna()   # 非原地修改,要原地修改必须加inplace=True
# 按列删除包含空值的列
df1.dropna(axis=1)
# 设置整行/列全部为空时才删除
df1.dropna(how='all')
## 缺失值填充
df2 = pd.read_excel(r'缺失值处理_替换值.xlsx')
# 1. 替换所有暂无为缺失值。两种方式,一种是导入时替换,一种是导入后替换,两种均可。
# 导入时直接就替换
df2 = pd.read_excel(r'缺失值处理_替换值.xlsx', na_values='暂无')
df2
# 导入后通过replace替换
df2.replace('暂无', np.nan, inplace=True)
df2
# 为了进行数值计算,必须先将数据类型转换为float。
# 以售价列为例,将售价列的万字去掉
df2['售价'] = df2['售价'].apply(
    # if语句是判断x是否为空,不为空就替换。必须判断,否则会将缺失值替换为字符串值
    lambda x: str(x).replace('万', '') if x is not np.nan else x
)
df2['售价'] = df2['售价'].astype(np.float64)
df2.describe()
df2.describe().iloc[2,0]  # 取其中的某个值
# 现在就可以替换空值了,以平均值替换为例。
# fillna方法注意:
# 1. 非原地修改。
# 2. 根据列名指定每列用来替换缺失值的值,有多少列填多少列
df2.fillna({'售价': df2['售价'].mean()})   ## 用售价列的平均值来填充售价列的缺失值
  • 重复值处理

重复值我们一般就做删除操作就可以了。

df1 = pd.read_excel(r'重复值处理.xlsx')
print(df1)
# python中利用drop_duplicates方法删除重复值,注意默认必须整行所有值都重复才算重复
df1.drop_duplicates(inplace=True)   # 非原地修改,要设置inplace。默认保留第一个重复值。
df1.reset_index(drop=True)   # 删除重复值后index不会自动调整,如果需要重置index可以使用这句
# 根据某/多列重复作为判断重复的依据
print(df1.drop_duplicates(subset=['日期', '售价']))
  • 异常值处理

对于异常值一般有以下几种处理方式。

  • 最常用的处理方式就是删除。 - 把异常值当作缺失值来填充。 - 把异常值当作特殊情况,研究异常值出现的原因。
df = pd.read_excel(r'异常值处理.xlsx', parse_dates=['日期'])
print(df.describe(include='all'))
# 从这里可以看到日期的最大值是2023年的,明显区别于正常的年份值。另外,售价的最小值是负数,也是异常值
  • 数据类型转换

    通常我们从外部文件中读取的数据类型都是以object或者string形式导入的数据,这时我们就需要将这些数据转换成它真正的数据类型,便于我们在后续的数据分析过程中进行操作。

# 在python中查看数据类型的方式
df = pd.read_excel(r'数据类型转换.xlsx')
df.info()
print(df.dtypes)
# 将售价转为整型
print(df['售价'].astype(np.int_))
# 日期格式转换
print(pd.to_datetime(df['日期']))
# df['日期'] = pd.to_datetime(df['日期'])  # 将原来的日期值进行替换
# 在导入时就直接转换日期
df = pd.read_excel(r'数据类型转换.xlsx', parse_dates=['日期'])
df.info()
# print(df['日期'].dt.day)   # 转成日期类型后,可以直接查看年月日的信息
# 直接把列数据当成字符串来使用,可以通过str方法实现
df['部门'].str.replace('部', '组')   # 将部门列的部字换成组字
df['部门'].str[:2]                   # 获取部门列的前两个字
  • 索引的设置

对于有些数据中没有索引值的,为了方便操作,必须为这些数据添加索引值。如果索引值有问题的,可以通过pandas重设索引值。

# 在python中为没有索引的数据添加行和列索引
df = pd.read_excel(r'索引设置.xlsx', header=None)
df.columns = ['加入日期', '售价', '等级', '姓名', '部门', '身高']
df.index = ['a', 'b', 'c', 'd', 'e', 'f']
print(df)
# 设置特定的列作为行索引,例如将加入日期作为行索引
df['加入日期'] = pd.to_datetime(df['加入日期'])
df.set_index('加入日期', inplace=True)  # 不要重复执行这句代码,会报错
print(df)
print(df.index)
# 设置时间类型的索引后,可以直接按照时间日期格式来选择数据
print(df.loc['2020-03'])  # 只选2020-03月的
print(df.loc['2020'])
print(df.loc[df.index.month==3])  # 只选择3月份的记录
# 选择一个时间段的数据
df.sort_index(inplace=True)    # 必须要先进行索引排序后操作
print(df.loc['2020-03-01': '2020-03-03'])