数据清洗是数据分析的第一步,它的好坏直接影响到后续分析的准确性和可靠性。下面我们将详细介绍 12 种常见的数据清洗技术,并通过实际的代码示例来帮助大家更好地理解和掌握这些技术。
包含编程资料、学习路线图、源代码、软件安装包等!【[点击这里] 】!
1.删除缺失值
数据集中经常会有一些缺失值,这些缺失值可能会干扰我们的分析。我们可以选择删除含有缺失值的行或列。
import pandas as pd
data = {
'A' : [ 1 , 2 , None , 4 ] ,
'B' : [ 5 , None , 7 , 8 ] ,
'C' : [ 9 , 10 , 11 , 12 ] }
df = pd. DataFrame( data)
df. dropna( inplace= True )
print ( df)
输出结果:
A B C
3 4 8 12
解释:
dropna()
方法用于删除含有缺失值的行或列inplace=True
参数表示直接在原数据上进行操作,不返回新的 DataFrame。
2.填充缺失值
有时候删除缺失值并不是最佳选择,我们可以选择填充缺失值。常见的填充方法包括使用均值、中位数、众数等。
df = pd. DataFrame( data)
df. fillna( df. mean( ) , inplace= True )
print ( df)
输出结果:
A B C
0 1.0 5.0 9
1 2.0 7.5 10
2 3.0 7.0 11
3 4.0 8.0 12
解释:
fillna()
方法用于填充缺失值。df.mean()
计算每一列的均值,并用这些均值填充缺失值。
3.删除重复值
数据集中可能会有重复的记录,这些重复记录会影响分析结果。我们可以使用 drop_duplicates()
方法删除重复值。
data = {
'A' : [ 1 , 2 , 2 , 4 ] ,
'B' : [ 5 , 6 , 6 , 8 ] ,
'C' : [ 9 , 10 , 10 , 12 ] }
df = pd. DataFrame( data)
df. drop_duplicates( inplace= True )
print ( df)
输出结果:
A B C
0 1 5 9
1 2 6 10
3 4 8 12
解释:
drop_duplicates()
方法用于删除重复的行。inplace=True
参数表示直接在原数据上进行操作,不返回新的 DataFrame。
4.转换数据类型
有时候数据的类型可能不符合我们的需求,我们需要转换数据类型。例如,将字符串类型的数字转换为数值类型。
data = {
'A' : [ '1' , '2' , '3' , '4' ] ,
'B' : [ '5' , '6' , '7' , '8' ] }
df = pd. DataFrame( data)
df[ 'A' ] = df[ 'A' ] . astype( int )
df[ 'B' ] = df[ 'B' ] . astype( float )
print ( df)
输出结果:
A B
0 1 5.0
1 2 6.0
2 3 7.0
3 4 8.0
解释:
astype()
方法用于转换数据类型。int
和 float
分别表示整数和浮点数类型。
5.处理异常值
异常值是指那些与其他数据明显不同的值,它们可能会对分析结果产生负面影响。我们可以使用统计方法来检测和处理异常值。
data = {
'A' : [ 1 , 2 , 3 , 100 ] ,
'B' : [ 5 , 6 , 7 , 8 ] }
df = pd. DataFrame( data)
Q1 = df. quantile( 0.25 )
Q3 = df. quantile( 0.75 )
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
df = df[ ~ ( ( df < lower_bound) | ( df > upper_bound) ) . any ( axis= 1 ) ]
print ( df)
输出结果:
A B
0 1 5
1 2 6
2 3 7
解释:
quantile()
方法用于计算四分位数。IQR
表示四分位距,即第三四分位数减去第一四分位数。lower_bound
和 upper_bound
分别表示异常值的下界和上界。~
符号表示取反,any(axis=1)
表示任何一列有异常值的行都会被删除。
6.标准化和归一化
标准化和归一化是数据预处理中的重要步骤,它们可以将数据转换到相同的尺度,便于后续的分析和建模。
from sklearn. preprocessing
import StandardScaler, MinMaxScaler
data = {
'A' : [ 1 , 2 , 3 , 4 ] ,
'B' : [ 5 , 6 , 7 , 8 ] }
df = pd. DataFrame( data)
scaler = StandardScaler( )
df_scaled = scaler. fit_transform( df)
df_scaled = pd. DataFrame( df_scaled, columns= df. columns)
print ( "标准化后的数据:" )
print ( df_scaled)
scaler = MinMaxScaler( )
df_normalized = scaler. fit_transform( df)
df_normalized = pd. DataFrame( df_normalized, columns= df. columns)
print ( "\n归一化后的数据:" )
print ( df_normalized)
输出结果
标准化后的数据:
A B
0 - 1.341641 - 1.341641
1 - 0.447214 - 0.447214
2 0.447214 0.447214
3 1.341641 1.341641
归一化后的数据:
A B
0 0.000000 0.000000
1 0.333333 0.333333
2 0.666667 0.666667
3 1.000000 1.000000
解释:
StandardScaler
用于标准化,将数据转换为均值为 0,标准差为 1 的分布。MinMaxScaler
用于归一化,将数据缩放到 [0, 1] 区间。
7.重命名列名
有时候我们需要对数据集的列名进行重命名,以便更好地理解和使用数据。
data = {
'A' : [ 1 , 2 , 3 , 4 ] ,
'B' : [ 5 , 6 , 7 , 8 ] }
df = pd. DataFrame( data)
df. rename( columns= { 'A' : 'Column1' , 'B' : 'Column2' } , inplace= True )
print ( df)
输出结果:
Column1 Column2
0 1 5
1 2 6
2 3 7
3 4 8
解释:
rename()
方法用于重命名列名。columns
参数是一个字典,键是旧列名,值是新列名。inplace=True
参数表示直接在原数据上进行操作,不返回新的 DataFrame。
8.合并数据集
在数据分析中,我们经常需要将多个数据集合并在一起。Pandas 提供了多种合并方法,如 concat
和 merge
。
data1 = {
'A' : [ 1 , 2 , 3 ] ,
'B' : [ 4 , 5 , 6 ] }
df1 = pd. DataFrame( data1)
data2 = {
'A' : [ 4 , 5 , 6 ] ,
'B' : [ 7 , 8 , 9 ] }
df2 = pd. DataFrame( data2)
df_concat = pd. concat( [ df1, df2] , ignore_index= True )
print ( "使用 concat 合并的数据集:" )
print ( df_concat)
df_merge = pd. merge( df1, df2, on= 'A' , how= 'outer' )
print ( "\n使用 merge 合并的数据集:" )
print ( df_merge)
输出结果:
使用 concat 合并的数据集:
A B
0 1 4
1 2 5
2 3 6
3 4 7
4 5 8
5 6 9
使用 merge 合并的数据集:
A B_x B_y
0 1.0 4.0 NaN
1 2.0 5.0 NaN
2 3.0 6.0 NaN
3 4.0 NaN 7.0
4 5.0 NaN 8.0
5 6.0 NaN 9.0
解释:
pd.concat()
方法用于纵向或横向拼接多个数据集。ignore_index=True
参数表示重新生成索引。pd.merge()
方法用于根据指定的列进行合并。on='A'
参数表示根据列 ‘A’ 进行合并。how='outer'
参数表示外连接,保留所有数据。
9.日期时间处理
日期时间数据在数据分析中非常常见,我们需要学会如何处理这些数据。
data = {
'Date' : [ '2023-01-01' , '2023-01-02' , '2023-01-03' ] ,
'Value' : [ 10 , 20 , 30 ] }
df = pd. DataFrame( data)
df[ 'Date' ] = pd. to_datetime( df[ 'Date' ] )
df[ 'Year' ] = df[ 'Date' ] . dt. year
df[ 'Month' ] = df[ 'Date' ] . dt. month
df[ 'Day' ] = df[ 'Date' ] . dt. day
print ( df)
输出结果:
Date Value Year Month Day
0 2023 - 01 - 01 10 2023 1 1
1 2023 - 01 - 02 20 2023 1 2
2 2023 - 01 - 03 30 2023 1 3
解释:
pd.to_datetime()
方法用于将字符串类型的日期时间转换为 datetime 类型。dt
属性提供了多种日期时间相关的操作,如提取年份、月份和日期。
10.文本数据处理
文本数据在数据分析中也很常见,我们需要学会如何处理这些数据。
data = {
'Text' : [ 'hello world' , 'python programming' , 'data science' ] }
df = pd. DataFrame( data)
df[ 'Text' ] = df[ 'Text' ] . str . lower( )
df[ 'Text' ] = df[ 'Text' ] . str . replace( ' ' , '_' )
print ( df)
输出结果:
Text
0 hello_world
1 python_programming
2 data_science
解释:
str.lower()
方法用于将文本数据转换为小写。str.replace()
方法用于替换文本中的特定字符。
11.处理分类数据
分类数据在数据分析中也很常见,我们需要学会如何处理这些数据。
data = {
'Category' : [ 'A' , 'B' , 'A' , 'C' , 'B' , 'A' ] }
df = pd. DataFrame( data)
df[ 'Category' ] = df[ 'Category' ] . astype( 'category' )
print ( df[ 'Category' ] . cat. codes)
输出结果:
0 0
1 1
2 0
3 2
4 1
5 0
Name: Category, dtype: int8
解释
astype('category')
方法用于将数据转换为类别类型。cat.codes
属性用于查看类别的编码。
12.处理缺失值的高级技巧
除了简单的删除和填充缺失值,还有一些高级技巧可以帮助我们更好地处理缺失值。
data = {
'A' : [ 1 , 2 , None , 4 ] ,
'B' : [ 5 , None , 7 , 8 ] ,
'C' : [ 9 , 10 , 11 , 12 ] }
df = pd. DataFrame( data)
df. fillna( method= 'ffill' , inplace= True )
print ( "前向填充后的数据:" )
print ( df)
df = pd. DataFrame( data)
df. fillna( method= 'bfill' , inplace= True )
print ( "\n后向填充后的数据:" )
print ( df)
输出结果:
前向填充后的数据:
A B C
0 1.0 5.0 9
1 2.0 5.0 10
2 2.0 7.0 11
3 4.0 8.0 12
后向填充后的数据:
A B C
0 1.0 5.0 9
1 2.0 7.0 10
2 4.0 7.0 11
3 4.0 8.0 12
总结
以上介绍了十二种常用的数据清洗技术,包括删除缺失值、填充缺失值、删除重复值、转换数据类型、处理异常值、标准化与归一化、重命名列名、合并数据集、日期时间处理、文本数据处理、处理分类数据以及处理缺失值的高级技巧。通过实际代码示例展示了每种技术的具体应用,有助于读者更好地理解和掌握这些技术。
总结
最后希望你编程学习上不急不躁,按照计划有条不紊推进,把任何一件事做到极致,都是不容易的,加油,努力!相信自己!
文末福利
最后这里免费分享给大家一份Python全套学习资料,希望能帮到那些不满现状,想提升自己却又没有方向的朋友,也可以和我一起来学习交流呀。
包含编程资料、学习路线图、源代码、软件安装包等!【[点击这里] 】领取!
① Python所有方向的学习路线图,清楚各个方向要学什么东西 ② 100多节Python课程视频,涵盖必备基础、爬虫和数据分析 ③ 100多个Python实战案例,学习不再是只会理论 ④ 华为出品独家Python漫画教程,手机也能学习
可以扫描下方二维码领取【保证100%免费 】