首页 > 分享 > Python 数据清洗

Python 数据清洗

文章目录 一.数据清洗与准备1.缺失值过滤(删除缺失值)补全 2.数据转换去重series的逐元素转换:map替换特定值replace重命名索引分组,划分区间随机抽样随机重排序哑变量 3.字符串操作内建字符串方法向量化字符串函数 二.数据合并与重塑1. 数据库风格的DataFrame连接2. 轴向拼接3. 重塑和透视长数据(冗余数据)透视为宽数据(正常数据)宽透视为长 三.数据聚合与分组-groupby-详见第10章 一.数据清洗与准备 1.缺失值

NaN(np.nan): 对数值型数据,浮点值NaN(not a number)
NA(not available)
None 均为缺失值,通过data.isnull()检测,反方法:data.notnull()

过滤(删除缺失值)

newdata = data.dropna() 等价于 data[data.notnull()]
默认删除含有缺失值的整行

可选参数:
how=‘all’:当一行全是缺失值才删除该行,否则不删除
axis=1:删除列
thresh=n:保留含有n个观测值的行

补全

newdata = data.fillna(value) :将缺失值替换为value
为不同列的NA设置不同的填充值:传入字典data.fillna({列名:value,…})

常用可选参数(详见文档字符串):
inplace=True:修改原对象而不返回新对象;
method=:插值方法,(比如’ffill’:用前面的值填补后面所有的缺失值),
与limit=n搭配,设置前向或后向填充时最大填充范围;
axis=1:需要填充的轴

可以用数据的平均值或中位数填充NA:data.fillna(data.mean())

2.数据转换 去重

df.duplicated(): 是否有重复值,返回同大小的TF结构
newdata = df.drop_duplicates([‘col1’]):基于某些列删除重复值,默认保留第一条重复行

常用可选参数(详见文档字符串):

列名列表:基于某些列去重keep=‘last’:保留最后一条重复行 series的逐元素转换:map

se.map(映射:函数或字典):每个元素传入到函数或字典中进行转换
字典就是映射!字典就是映射!字典就是映射!

# 创建肉类的数据框 data = pd.DataFrame({'food':['bacon','beef','Bacon','nova lox'],'weight':[4,3,12,6]}) print(data) # 添加一列表示每种食物的动物肉来源 # 创建一个食物与动物肉的映射关系 meat_to_animal = {'bacon':'pig','beef':'cow','nova lox':'salmon'} # 培根是猪肉... # 先统一数据的大小写se.str.lower(),再逐一映射,下面两条语句等价: data['animal'] = data['food'].str.lower().map(meat_to_animal) # 传入字典进行映射 data['animal'] = data['food'].map(lambda x: meat_to_animal[x.lower()]) # 传入函数进行映射 data 1234567891011

在这里插入图片描述

替换特定值replace

data.replace(old,new) : 将旧值替换为新值,df全表搜索
可以多对一,多对多,传入列表,按顺序对应,或者传入字典,例如:data.replace([old1,old2,…],[new1])
data.replace([old1,old2,…],[new1,new2,…])
data.replace({old1:new1,old2:new2,…})

重命名索引 对索引对象直接赋值:如data.index = range(len(data)),直接修改了原对象更全的方法 : data.rename(index=map1,columns=map2,inplace=False)
映射包括函数与字典。

# 每个行索引值-4,截至时间列修改列名为date,直接修改原对象 data.rename(index=lambda x:x-4,columns={'截至时间(24h)':'date'},inplace=True) 1234

如果传入的不是映射,是直接的数据,会报错:xxx object is not callable.不可调用

分组,划分区间

连续值的离散化,返回Categorical对象,包含了类别标识和标签
cgc = pd.cut(x=data,bins=分点列表或分组个数)
cgc = pd.qcut(data,bins=分位数列表或分位数个数)

常用可选参数(详见文档字符串):
right=True: 区间默认左开右闭,False变为左闭右开
labels=None: 自定义分组名,传入列表或者数组
precision=3:小数位数

在这里插入图片描述

随机抽样

newdata = data.sample(n,replace=True) : 默认无放回随机抽样,抽n个
replace=False:有放回

随机重排序

a = np.random.permutation(n) : 将0~n-1重排序
newdata = df.take(a) or df.iloc(a) # 将顺序应用于索引即为重排序

哑变量

newdata = pd.get_dummies(df[‘col1’]) :将df的一列因子型(字符或Categorical对象)设置为多个哑变量,变成多列01,因子有n个水平则变为n列。

可选参数
prefix=‘a’:为新生成的列名加上前缀’a’以区分

例如:对数据分组后设为哑变量:pd.get_dummies(pd.cut(data,bins))

3.字符串操作 内建字符串方法 方法描述string.split(分隔符)拆分分隔字符串.strip()去除字符串两端空格及换行符.rstrip()/.lstrip()去除字符串右端或左端空白分隔符.join(字符串列表或元组)以连接符连接各字符串.count(子串)子串出现的次数.replace(old,new)将字符串中的old替换为new,常用于传入空串来实现删除效果.endswith(后缀)/.startwith(前缀)字符串是否以后缀结尾或前缀开头.lower()/.upper()大小写转换子串 in 字符串字符串中是否含有某子串.index(子串)/.find(子串)字符串中是否含有某子串,返回第一次出现的头位置,index找不到报错,find返回-1

string = 'a,b, guido ' l = [x.strip() for x in string.split(',')] # ['a', 'b', 'guido'] ':'.join(l) # 'a:b:guido' 123' 向量化字符串函数

1.Series.str属性:就是把每个元素作为字符串去逐元素应用字符串的方法
se.str.contains(string or regex) :每个元素是否包含string或正则表达式
在这里插入图片描述
通过se.str属性可以调用任意正则表达式的方法应用于每一个元素,se.str就是将se变为每一个元素都是str,然后逐元素应用正则表达式。

data['food'].str.findall(regex) # 对每个元素查找匹配项 data['food'].str.get(0) # 得到每个元素的第一个字符 data['food'].str[:2] # 对每个元素进行统一切片 123

所有内建字符串方法都可以通过se.str.内建方法()对每个元素统一应用。具体方法详见P215。

二.数据合并与重塑 1. 数据库风格的DataFrame连接

pd.merge(df1,df2,on=,how= ) :不管内外连接,只要多对一,少的都自动重复

可选参数:

on=: 按哪个列连接,两个df的列名需要一样,否则指定
left_on=: (df1),right_on=:(df2)how=: ‘outer’:外连接,两个df的键的并集,没有就引入NA,使用dropna后结果就是内连接
    ‘inner’:内连接,键的交集
    ‘left’:按照左边df1的键进行连接
    ‘right’:按照右边df2的键进行连接suffixes:重叠的列名后面加上后缀以示区分sort=True:默认排序,大数据集上可禁用该功能以获得更好的性能indicator:添加一列_merge,指示每一行的来源

按行索引合并,等同于几个数据框横向拼接,默认多去少补NA
df1.join(df2,how=‘inner’):
df1.join([df2,df3,…],how=)

2. 轴向拼接

对NumPy数组:
np.concatnate([arr1,arr2],axis=)
对df:
pd.concat([data1,data2],axis=0,join=‘outer’) 按行纵向拼接,默认索引并集

可选参数:
ignore_index:True:忽略索引直接拼,顺着产生新索引

3. 重塑和透视

1.有关多重索引
newdata = data.stack() 所有列变成一列因子型,列名是因子,df变成多重索引的se.
data = newdata.unstack() 还原

长数据(冗余数据)透视为宽数据(正常数据)

长格式:列少,列有冗余,主键多于一个,共同决定一行
newdata = pivot(‘col1’,‘col2’,‘col3’)

col1:该列的值作为行索引,成为唯一主键
col2:该列是因子型,因子的水平成为新列
col3:可选的数字列填充

等价于先用set_index创建分层索引,然后调用unstack
   ⟺    iff ⟺ newdata = data.set_index([‘col1’,‘col2’]).unstack(‘col3’)

宽透视为长

反操作,将多列合成一列,长度更长,产生冗余

df = pd.DataFrame({'key':['foo','bar','baz'], 'a':[1,2,3], 'b':[4,5,6], 'c':[7,8,9]}) df 12345

在这里插入图片描述

melted = pd.melt(df,id_vars=['key']) # 必须指明分组指标id_vars,是主键的第一部分,是不变的列 melted # variable是新产生的列,是主键的第二部分 12

在这里插入图片描述
还原

data = melted.pivot('key','variable','value') data 12

在这里插入图片描述
由于key并不是原来的索引,所以将数据回移一列

data.reset_index() 1

在这里插入图片描述

三.数据聚合与分组-groupby-详见第10章

相关知识

Python pandas 数据清洗(二)
Python 数据清洗
【创新课题】猫狗养殖户养殖决策系统:基于python爬虫猫狗电商销售数据可视化分析
Python爬虫入门教程31:爬取猫咪交易网站数据并作数据分析
机器学习之数据预处理(Python 实现)
python爬虫项目(九十六):爬取宠物论坛的用户发帖数据,分析宠物市场需求
Python基于大数据技术的宠物商品信息比价及推荐系统
宠物数据可视化如何做
社交媒体数据分析的可视化展示:让数据讲述故事
Python 日志教程

网址: Python 数据清洗 https://m.mcbbbk.com/newsview475134.html

所属分类:萌宠日常
上一篇: Python 数据清洗之缺失数据
下一篇: 酒吧的女生都“不干净”,去酒吧=