数据分析工具Pandas基础 数据清洗--处理缺失数据、处理重复数据、替换数据处理

理论:

明确问题:

数据需要修改吗?

有什么需要修改的吗?

数据应该怎么调整才能适用于接下来的分析和挖掘?

数据清洗的特点:

是一个迭代的过程,实际项目中可能需要不止一次地执行这些清洗操作

处理缺失数据:

判断是否存在缺失值ser_obj.isnull(), df_obj.isnull(),可以结合any()判断行/列中是否存在缺失值

1.丢弃缺失数据:dropna(),注意inplace参数

2.填充缺失数据:fillna(value),以value填充数据

ffill()和bfill(),项目中使用ffill()或bfill()时,注意数据的排列顺序

df.ffill()或者df.fillna(method=”ffill”),按之前的数据填充

df.bfill()或者df.bfill(method=”bfill”),按之后的数据填充

3.axis:默认axis=0,0表示以垂直方向进行操作,也就是按照列索引中的每列数据进行操作,1表示在水平方向进行操作,也就是按照行索引中的每行数据进行操作。

处理重复数据:

duplicated(subset) 返回布尔型Series,表示每行是否为重复行

drop_duplicates(subset, keep) 过滤重复行,是对subset中的数据进行重复行过滤

默认判断全部列,可通过参数subset指定某些列

keep,默认(first)保留第一次出现的数据,last表示保留重复行的最后一行

替换数据处理:

df.replace(to_replace)参数to_replace为可以是:

数值,字符串:需要替换的值,新的值,比如to_replace=23,45,表示将df数据中的23替换为45

列表:第一个列表中的元素是需要被替换掉的值,第二个列表中的元素是新的值。两个列表需要一一对应。

字典,键是需要被替换掉的值,值为新的值

实验:

第五课 数据分析工具Pandas基础

数据清洗--处理缺失数据

In [1]:

 

import pandas as pd

In [2]:

 

 
# 读取文件
filepath = r'C:\Users\ML Learning\Projects\第四章-数据分析预习内容\第四章-数据分析预习内容\第一节-数据分析工具pandas基础\lesson_05\lesson_05\examples\datasets\log.csv'
log_data = pd.read_csv(filepath)
log_data

Out[2]:

 timeuservideoplayback positionpausedvolume
01469974424cherylintro.html5False10.0
11469974454cherylintro.html6NaNNaN
21469974544cherylintro.html9NaNNaN
31469974574cherylintro.html10NaNNaN
41469977514bobintro.html1NaNNaN
51469977544bobintro.html1NaNNaN
61469977574bobintro.html1NaNNaN
71469977604bobintro.html1NaNNaN
81469974604cherylintro.html11NaNNaN
91469974694cherylintro.html14NaNNaN
101469974724cherylintro.html15NaNNaN
111469974454sueadvanced.html24NaNNaN
121469974524sueadvanced.html25NaNNaN
131469974424sueadvanced.html23False10.0
141469974554sueadvanced.html26NaNNaN
151469974624sueadvanced.html27NaNNaN
161469974654sueadvanced.html28NaN5.0
171469974724sueadvanced.html29NaNNaN
181469974484cherylintro.html7NaNNaN
191469974514cherylintro.html8NaNNaN
201469974754sueadvanced.html30NaNNaN
211469974824sueadvanced.html31NaNNaN
221469974854sueadvanced.html32NaNNaN
231469974924sueadvanced.html33NaNNaN
241469977424bobintro.html1True10.0
251469977454bobintro.html1NaNNaN
261469977484bobintro.html1NaNNaN
271469977634bobintro.html1NaNNaN
281469977664bobintro.html1NaNNaN
291469974634cherylintro.html12NaNNaN
301469974664cherylintro.html13NaNNaN
311469977694bobintro.html1NaNNaN
321469977724bobintro.html1NaNNaN

判断是否存在缺失值

In [3]:

 

 
log_data.isnull()

Out[3]:

 timeuservideoplayback positionpausedvolume
0FalseFalseFalseFalseFalseFalse
1FalseFalseFalseFalseTrueTrue
2FalseFalseFalseFalseTrueTrue
3FalseFalseFalseFalseTrueTrue
4FalseFalseFalseFalseTrueTrue
5FalseFalseFalseFalseTrueTrue
6FalseFalseFalseFalseTrueTrue
7FalseFalseFalseFalseTrueTrue
8FalseFalseFalseFalseTrueTrue
9FalseFalseFalseFalseTrueTrue
10FalseFalseFalseFalseTrueTrue
11FalseFalseFalseFalseTrueTrue
12FalseFalseFalseFalseTrueTrue
13FalseFalseFalseFalseFalseFalse
14FalseFalseFalseFalseTrueTrue
15FalseFalseFalseFalseTrueTrue
16FalseFalseFalseFalseTrueFalse
17FalseFalseFalseFalseTrueTrue
18FalseFalseFalseFalseTrueTrue
19FalseFalseFalseFalseTrueTrue
20FalseFalseFalseFalseTrueTrue
21FalseFalseFalseFalseTrueTrue
22FalseFalseFalseFalseTrueTrue
23FalseFalseFalseFalseTrueTrue
24FalseFalseFalseFalseFalseFalse
25FalseFalseFalseFalseTrueTrue
26FalseFalseFalseFalseTrueTrue
27FalseFalseFalseFalseTrueTrue
28FalseFalseFalseFalseTrueTrue
29FalseFalseFalseFalseTrueTrue
30FalseFalseFalseFalseTrueTrue
31FalseFalseFalseFalseTrueTrue
32FalseFalseFalseFalseTrueTrue

In [4]:

 

log_data.isnull().any()  # 针对每一列

Out[4]:

time                 False
user                 False
video                False
playback position    False
paused                True
volume                True
dtype: bool

In [5]:

 

log_data.isnull().any(axis=1)

Out[5]:

0     False
1      True
2      True
3      True
4      True
5      True
6      True
7      True
8      True
9      True
10     True
11     True
12     True
13    False
14     True
15     True
16     True
17     True
18     True
19     True
20     True
21     True
22     True
23     True
24    False
25     True
26     True
27     True
28     True
29     True
30     True
31     True
32     True
dtype: bool

丢失缺失值

In [11]:

 

log_data.dropna(subset=['volume'])

Out[11]:

 timeuservideoplayback positionpausedvolume
01469974424cherylintro.html5False10.0
131469974424sueadvanced.html23False10.0
161469974654sueadvanced.html28NaN5.0
241469977424bobintro.html1True10.0

填充缺失值

In [8]:

 

log_data.fillna(-1)

Out[8]:

 timeuservideoplayback positionpausedvolume
01469974424cherylintro.html5False10.0
11469974454cherylintro.html6-1-1.0
21469974544cherylintro.html9-1-1.0
31469974574cherylintro.html10-1-1.0
41469977514bobintro.html1-1-1.0
51469977544bobintro.html1-1-1.0
61469977574bobintro.html1-1-1.0
71469977604bobintro.html1-1-1.0
81469974604cherylintro.html11-1-1.0
91469974694cherylintro.html14-1-1.0
101469974724cherylintro.html15-1-1.0
111469974454sueadvanced.html24-1-1.0
121469974524sueadvanced.html25-1-1.0
131469974424sueadvanced.html23False10.0
141469974554sueadvanced.html26-1-1.0
151469974624sueadvanced.html27-1-1.0
161469974654sueadvanced.html28-15.0
171469974724sueadvanced.html29-1-1.0
181469974484cherylintro.html7-1-1.0
191469974514cherylintro.html8-1-1.0
201469974754sueadvanced.html30-1-1.0
211469974824sueadvanced.html31-1-1.0
221469974854sueadvanced.html32-1-1.0
231469974924sueadvanced.html33-1-1.0
241469977424bobintro.html1True10.0
251469977454bobintro.html1-1-1.0
261469977484bobintro.html1-1-1.0
271469977634bobintro.html1-1-1.0
281469977664bobintro.html1-1-1.0
291469974634cherylintro.html12-1-1.0
301469974664cherylintro.html13-1-1.0
311469977694bobintro.html1-1-1.0
321469977724bobintro.html1-1-1.0

ffill() 按之前进行排序 bfill()按之后进行排列

In [12]:

 

 
# 对数据进行排序
sorted_log_data = log_data.sort_values(['time','user'])
sorted_log_data

Out[12]:

 timeuservideoplayback positionpausedvolume
01469974424cherylintro.html5False10.0
131469974424sueadvanced.html23False10.0
11469974454cherylintro.html6NaNNaN
111469974454sueadvanced.html24NaNNaN
181469974484cherylintro.html7NaNNaN
191469974514cherylintro.html8NaNNaN
121469974524sueadvanced.html25NaNNaN
21469974544cherylintro.html9NaNNaN
141469974554sueadvanced.html26NaNNaN
31469974574cherylintro.html10NaNNaN
81469974604cherylintro.html11NaNNaN
151469974624sueadvanced.html27NaNNaN
291469974634cherylintro.html12NaNNaN
161469974654sueadvanced.html28NaN5.0
301469974664cherylintro.html13NaNNaN
91469974694cherylintro.html14NaNNaN
101469974724cherylintro.html15NaNNaN
171469974724sueadvanced.html29NaNNaN
201469974754sueadvanced.html30NaNNaN
211469974824sueadvanced.html31NaNNaN
221469974854sueadvanced.html32NaNNaN
231469974924sueadvanced.html33NaNNaN
241469977424bobintro.html1True10.0
251469977454bobintro.html1NaNNaN
261469977484bobintro.html1NaNNaN
41469977514bobintro.html1NaNNaN
51469977544bobintro.html1NaNNaN
61469977574bobintro.html1NaNNaN
71469977604bobintro.html1NaNNaN
271469977634bobintro.html1NaNNaN
281469977664bobintro.html1NaNNaN
311469977694bobintro.html1NaNNaN
321469977724bobintro.html1NaNNaN

In [14]:

 

 
sorted_log_data.ffill()

Out[14]:

 timeuservideoplayback positionpausedvolume
01469974424cherylintro.html5False10.0
131469974424sueadvanced.html23False10.0
11469974454cherylintro.html6False10.0
111469974454sueadvanced.html24False10.0
181469974484cherylintro.html7False10.0
191469974514cherylintro.html8False10.0
121469974524sueadvanced.html25False10.0
21469974544cherylintro.html9False10.0
141469974554sueadvanced.html26False10.0
31469974574cherylintro.html10False10.0
81469974604cherylintro.html11False10.0
151469974624sueadvanced.html27False10.0
291469974634cherylintro.html12False10.0
161469974654sueadvanced.html28False5.0
301469974664cherylintro.html13False5.0
91469974694cherylintro.html14False5.0
101469974724cherylintro.html15False5.0
171469974724sueadvanced.html29False5.0
201469974754sueadvanced.html30False5.0
211469974824sueadvanced.html31False5.0
221469974854sueadvanced.html32False5.0
231469974924sueadvanced.html33False5.0
241469977424bobintro.html1True10.0
251469977454bobintro.html1True10.0
261469977484bobintro.html1True10.0
41469977514bobintro.html1True10.0
51469977544bobintro.html1True10.0
61469977574bobintro.html1True10.0
71469977604bobintro.html1True10.0
271469977634bobintro.html1True10.0
281469977664bobintro.html1True10.0
311469977694bobintro.html1True10.0
321469977724bobintro.html1True10.0

In [15]:

 

 
sorted_log_data.bfill()

Out[15]:

 timeuservideoplayback positionpausedvolume
01469974424cherylintro.html5False10.0
131469974424sueadvanced.html23False10.0
11469974454cherylintro.html6True5.0
111469974454sueadvanced.html24True5.0
181469974484cherylintro.html7True5.0
191469974514cherylintro.html8True5.0
121469974524sueadvanced.html25True5.0
21469974544cherylintro.html9True5.0
141469974554sueadvanced.html26True5.0
31469974574cherylintro.html10True5.0
81469974604cherylintro.html11True5.0
151469974624sueadvanced.html27True5.0
291469974634cherylintro.html12True5.0
161469974654sueadvanced.html28True5.0
301469974664cherylintro.html13True10.0
91469974694cherylintro.html14True10.0
101469974724cherylintro.html15True10.0
171469974724sueadvanced.html29True10.0
201469974754sueadvanced.html30True10.0
211469974824sueadvanced.html31True10.0
221469974854sueadvanced.html32True10.0
231469974924sueadvanced.html33True10.0
241469977424bobintro.html1True10.0
251469977454bobintro.html1NaNNaN
261469977484bobintro.html1NaNNaN
41469977514bobintro.html1NaNNaN
51469977544bobintro.html1NaNNaN
61469977574bobintro.html1NaNNaN
71469977604bobintro.html1NaNNaN
271469977634bobintro.html1NaNNaN
281469977664bobintro.html1NaNNaN
311469977694bobintro.html1NaNNaN
321469977724bobintro.html1NaNNaN

处理重复数据

In [16]:

 

data = pd.DataFrame(
    {'age':[28, 31, 27, 28],
     'gender':['M','M','M','F'],
     'surname':['Liu','Li','Chen','Liu']}
)
data

Out[16]:

 agegendersurname
028MLiu
131MLi
227MChen
328FLiu

判断是否存在重复数据

In [17]:

 

 
data.duplicated()

Out[17]:

0    False
1    False
2    False
3    False
dtype: bool

In [18]:

 

 
data.duplicated(subset=['age','surname'])

Out[18]:

0    False
1    False
2    False
3     True
dtype: bool

In [19]:

 

 
data.drop_duplicates(subset=['age','surname'])

Out[19]:

 agegendersurname
028MLiu
131MLi
227MChen

In [23]:

 

 
data.drop_duplicates(subset=['age','surname'],keep='last')

Out[23]:

 agegendersurname
131MLi
227MChen
328FLiu

数据清洗--替换数据

In [24]:

 

 
data = pd.DataFrame(
    {'A':[0, 1, 2, 3, 4],
     'B':[5, 6, 7, 8, 9],
     'C':['a', 'b', 'c', 'd', 'e']}
)
data

Out[24]:

 ABC
005a
116b
227c
338d
449e

替换

In [25]:

 

# 数据替换
data.replace(0,100)

Out[25]:

 ABC
01005a
116b
227c
338d
449e

In [26]:

 

 
# 列表替换为值
data.replace([0, 1, 2, 3],4)

Out[26]:

 ABC
045a
146b
247c
348d
449e

In [27]:

 

 
# 列表替换为对应列表中的值
data.replace([0, 1, 2, 3],[4, 3, 2, 1])

Out[27]:

 ABC
045a
136b
227c
318d
449e

In [29]:

 

 
# 按字典替换
data.replace({0:10,1:100})

Out[29]:

 ABC
0105a
11006b
227c
338d
449e

In [ ]:

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值