一.数据清洗
- 清洗空值
- 清洗重复值
- 清洗异常值
1.清洗空值
有两种丢失数据: None
None是Python自带的,其类型为python object。因此,None不能参与到任何计算中。
np.nan(NaN)
np.nan是浮点类型,能参与到计算中。但计算的结果总是NaN。
①.pandas中的None与NaN
pandas中None与np.nan都视作np.nan
创建含空值的数据
from pandas import Series,DataFrame import pandas as pd import numpy as np
df = DataFrame(data=np.random.randint(0,100,size=(10,8))) df.iloc[1,3] = None df.iloc[3,5] = np.nan df.iloc[6,2] = None df.iloc[8,5] = np.nan df
② 删除整行记录
第一种通过判断
第二种 通过装饰好的内置函数
df.dropna() 可以选择过滤的是行还是列(默认为行):axis中0表示行,1表示的列
③填充数据
fillna():value和method参数
value : 直接写要填充的值
method: ffill :以前面为基础填充
bfill: 以后面为基础填充
axis: 0 : 列
1 : 行
2.清洗重复值
①创建有重复的数据
import numpy as np import pandas as pd from pandas import Series,DataFrame
df = DataFrame(data=np.random.randint(0,100,size=(8,5)))
df.iloc[2] = [6,6,6,6,6]
df.iloc[4] = [6,6,6,6,6]
df.iloc[6] = [6,6,6,6,6]
df
② 使用duplicated 进行去重
参数: keep:
first:保留第一个 last: 保留最后一个
drop_duplicates(keep='first/last'/False)
3.清洗异常值
①创建数据
df = DataFrame(data=np.random.random(size=(1000,3)),columns=['A','B','C'])
要求:
对df应用筛选条件,去除标准差太大的数据:假设过滤条件为 C列数据大于两倍的C列标准差
std_2 = df['C'].std() * 2 std_2
# 0.5888958710508151
# 取反
~(df['C'] > std_2)
最终:
df.loc[~(df['C'] > std_2)]
二. pandas的拼接操作
1.级联(表的拼接)
pd.concat,
参数:
objs
axis= 0 :列
1 :行
keys
join='outer' / 'inner':表示的是级联的方式,outer会将所有的项进行级联(忽略匹配和不匹配),
而inner只会将匹配的项级联到一起,不匹配的不级联
ignore_index=False
pd.append
①创建数据
import numpy as np from pandas import DataFrame,Series import pandas as pd
df1 = DataFrame(data=np.random.randint(0,100,size=(4,4)),index=['A','B','C','D'],columns=['a','b','c','d']) df2 = DataFrame(data=np.random.randint(0,100,size=(4,4)),index=['A','B','C','E'],columns=['a','b','c','e'])
②匹配的级联
③不匹配的级联
不匹配指的是级联的维度的索引不一致。例如纵向级联时列索引不一致,横向级联时行索引不一致 有2种连接方式: 外连接:补NaN(默认模式) 内连接:只连接匹配的项
2.合并(数据的拼接)
使用pd.merge()合并 merge与concat的区别在于,merge需要依据某一共同的列来进行合并 使用pd.merge()合并时,会自动根据两者相同column名称的那一列,作为key来进行合并。 注意每一列元素的顺序不要求一致 参数: how:outer取并集 不存在时用 NaN补充, inner取交集, left:以左侧为准, right:以右侧为准 on:当有多列相同的时候,可以使用on来指定使用那一列进行合并,on的值为一个列表
①一对一合并
df1 = DataFrame({'employee':['Bob','Jake','Lisa'], 'group':['Accounting','Engineering','Engineering'], })
df2 = DataFrame({'employee':['Lisa','Bob','Jake'], 'hire_date':[2004,2008,2012], })
②多对一合并
df3 = DataFrame({ 'employee':['Lisa','Jake'], 'group':['Accounting','Engineering'], 'hire_date':[2004,2016]})
df4 = DataFrame({'group':['Accounting','Engineering','Engineering'], 'supervisor':['Carly','Guido','Steve'] })
③多对多合并
df1 = DataFrame({'employee':['Bob','Jake','Lisa'], 'group':['Accounting','Engineering','Engineering']})
df5 = DataFrame({'group':['Engineering','Engineering','HR'], 'supervisor':['Carly','Guido','Steve'] })
④ key的标准化
第一种:
当列冲突时,即有多个列名称相同时,需要使用on=来指定哪一个列作为key,配合suffixes指定冲突列名
第二种:
当两张表没有可进行连接的列时,可使用left_on和right_on手动指定merge中左右两边的哪一列列作为连接的列
⑤内合并和外合并
三.替换 (replace)
1.单值替换
普通替换: 替换所有符合要求的元素:to_replace=15,value='e'
按列指定单值替换: to_replace={列标签:替换值}
2.多值替换
四. 映射(map)
map()可以映射新一列数据 map()中可以使用lambd表达式 map()中可以使用方法,可以是自定义的方法 eg:map({to_replace:value}) 注意 map()中不能使用sum之类的函数,for循环
map当做一种运算工具,至于执行何种运算,是由map函数的参数决定的(参数:lambda,函数)
#超过3000部分的钱缴纳50%的税 def after_sal(s): return s - (s - 3000)*0.5
五.排序(随机抽样)
使用.take()函数排序 - take()函数接受一个索引列表,用数字表示,使得df根据列表中索引的顺序进行排序 - eg:df.take([1,3,4,2,5])
可以借助np.random.permutation()函数随机排序
np.random.permutation(x)可以生成x个从0-(x-1)的随机数列
df.take(axis=1,indices=np.random.permutation(3)).take(axis=0,indices=np.random.permutation(1000)) df.take(axis=1,indices=np.random.permutation(3)).take(axis=0,indices=np.random.permutation(1000))[0:100]
六. 数据分类处理(重点)
数据聚合是数据处理的最后一步,通常是要使每一个数组生成一个单一的数值。 数据分类处理: - 分组:先把数据分为几组 - 用函数处理:为不同组的数据应用不同的函数以转换数据 - 合并:把不同组得到的结果合并起来 数据分类处理的核心: - groupby()函数 - groups属性查看分组情况 - eg: df.groupby(by='item').groups
from pandas import DataFrame,Series
df = DataFrame({'item':['Apple','Banana','Orange','Banana','Orange','Apple'], 'price':[4,3,3,2.5,4,2], 'color':['red','yellow','yellow','green','green','green'], 'weight':[12,20,50,30,20,44]}) df
七.高级数据聚合
使用groupby分组后,也可以使用transform和apply提供自定义函数实现更多的运算
df.groupby('item')['price'].sum() <==> df.groupby('item')['price'].apply(sum) transform和apply都会进行运算,在transform或者apply中传入函数即可 transform和apply也可以传入一个lambda表达式
# 函数
def fun(s): sum = 0 for i in s: sum+=i return sum/s.size
1. apply
2. transform(可以直接合并,更加方便)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。