最近发现有些知识以为自己会,用的时候又有点模糊,没办法,抽空整理下,一方面加深自己的记忆,另一方面,下次也有个地方可以查找。
数据处理之常用操作
数据规整化
合并数据
merge函数
merge函数是pandas自带的方法,实现的效果类似于数据库的join,可以外联,内联等数据连接需求。
实际中用来横向合并数据
一、参数:实际中用的多的也就是几个。
pd.merge(
left,right:这两个是必须的,是合并的两个DataFrame格式数据
how: ‘inner’,‘outer’,‘left’,'right’其中之一,默认是‘inner’
on=None:用于连接的列名,必须存在于两个表,且一致。
left_on=None,right_on=None:当不一致是用这两个参数分别指定连接的列
left_index=False,
right_index=False,
sort=False,
suffixes=(’_x’, ‘_y’),
copy=True,
indicator=False,
validate=None,)
二、示例
s1
业态 产品 推广平台 城市 展现量 点击量 消费 返点 推广方式
日期
2020-04-25 互联网 网站建设 神马搜索 杭州 10.0 1.0 9.45 0.35 网运
2020-04-25 互联网 网站建设 神马搜索 长沙 7.0 0.0 0.00 0.35 网运
2020-04-25 互联网 微信业务 搜狗搜索 杭州 6.0 1.0 1.26 0.35 网运
2020-04-25 互联网 微信业务 神马搜索 杭州 15.0 1.0 7.27 0.35 网运
2020-04-25 互联网 微信业务 神马搜索 长沙 5.0 1.0 14.94 0.35 网运
s2
业态 产品 推广平台 城市 展现量 点击量 消费 返点 推广方式
日期
2020-07-02 融资 信用贷款 百度信息流 杭州 17150.0 135.0 339.49 0.32 新媒体
2020-07-02 融资 信用贷款 百度信息流 北京 12076.0 99.0 435.00 0.32 新媒体
2020-07-02 融资 信用贷款 百度信息流 重庆 9742.0 110.0 387.12 0.32 新媒体
2020-07-02 交易 网店交易 今日头条 平台创新中心 10300.0 84.0 1000.00 0.05 新媒体
2020-07-02 交易 资质交易 今日头条 平台创新中心 5488.0 79.0 186.76 0.25 新媒体
pd.merge(s1,s2,how='outer',)
业态 产品 推广平台 城市 展现量 点击量 消费 返点 推广方式
0 互联网 网站建设 神马搜索 杭州 10.0 1.0 9.45 0.35 网运
1 互联网 网站建设 神马搜索 长沙 7.0 0.0 0.00 0.35 网运
2 互联网 微信业务 搜狗搜索 杭州 6.0 1.0 1.26 0.35 网运
3 互联网 微信业务 神马搜索 杭州 15.0 1.0 7.27 0.35 网运
4 互联网 微信业务 神马搜索 长沙 5.0 1.0 14.94 0.35 网运
5 融资 信用贷款 百度信息流 杭州 17150.0 135.0 339.49 0.32 新媒体
6 融资 信用贷款 百度信息流 北京 12076.0 99.0 435.00 0.32 新媒体
7 融资 信用贷款 百度信息流 重庆 9742.0 110.0 387.12 0.32 新媒体
8 交易 网店交易 今日头条 平台创新中心 10300.0 84.0 1000.00 0.05 新媒体
9 交易 资质交易 今日头条 平台创新中心 5488.0 79.0 186.76 0.25 新媒体
pd.merge(s1,s2,how='inner',on='城市',)
业态_x 产品_x 推广平台_x 城市 展现量_x 点击量_x 消费_x 返点_x 推广方式_x 业态_y 产品_y 推广平台_y 展现量_y 点击量_y 消费_y 返点_y 推广方式_y
0 互联网 网站建设 神马搜索 杭州 10.0 1.0 9.45 0.35 网运 融资 信用贷款 百度信息流 17150.0 135.0 339.49 0.32 新媒体
1 互联网 微信业务 搜狗搜索 杭州 6.0 1.0 1.26 0.35 网运 融资 信用贷款 百度信息流 17150.0 135.0 339.49 0.32 新媒体
2 互联网 微信业务 神马搜索 杭州 15.0 1.0 7.27 0.35 网运 融资 信用贷款 百度信息流 17150.0 135.0 339.49 0.32 新媒体
pd.merge(s1,s2,on='城市',right_index=True)
业态_x 产品_x 推广平台_x 城市 展现量_x 点击量_x 消费_x 返点_x 推广方式_x 业态_y 产品_y 推广平台_y 展现量_y 点击量_y 消费_y 返点_y 推广方式_y
日期
2020-04-25 互联网 网站建设 神马搜索 杭州 10.0 1.0 9.45 0.35 网运 融资 信用贷款 百度信息流 17150.0 135.0 339.49 0.32 新媒体
2020-04-25 互联网 微信业务 搜狗搜索 杭州 6.0 1.0 1.26 0.35 网运 融资 信用贷款 百度信息流 17150.0 135.0 339.49 0.32 新媒体
2020-04-25 互联网 微信业务 神马搜索 杭州 15.0 1.0 7.27 0.35 网运 融资 信用贷款 百度信息流 17150.0 135.0 339.49 0.32 新媒体
三、总结
1.有连接的列(如指定了参数on,left_on,right_on,right_index…)存在时,数据是横向连接,否则是纵向连接
2.right_index/left_index参数存在时,必须指定连接列,不论是on还是left_on
3.当选择外联时,没有的数据会自动填充NaN值
4.可以指定多层的连接列,只需要给参数传递列表数据就可以
concat函数
实际中用来纵向合并数据
一、参数
pd.concat(
objs:唯一必须参数,多个要合并数据必须以列表形式传入
axis=0:合并方向,一般用来纵向,不处理,默认0
join=‘outer’:只有’inner ‘和’outer’
join_axes=None,
ignore_index=False:忽视原有的索引
keys=None,
levels=None,
names=None,
verify_integrity=False,
sort=None,
copy=True,
)
二、示例
pd.concat([s1,s2], ignore_index=True)
业态 产品 推广平台 城市 展现量 点击量 消费 返点 推广方式
0 互联网 网站建设 神马搜索 杭州 10.0 1.0 9.45 0.35 网运
1 互联网 网站建设 神马搜索 长沙 7.0 0.0 0.00 0.35 网运
2 互联网 微信业务 搜狗搜索 杭州 6.0 1.0 1.26 0.35 网运
3 互联网 微信业务 神马搜索 杭州 15.0 1.0 7.27 0.35 网运
4 互联网 微信业务 神马搜索 长沙 5.0 1.0 14.94 0.35 网运
5 融资 信用贷款 百度信息流 杭州 17150.0 135.0 339.49 0.32 新媒体
6 融资 信用贷款 百度信息流 北京 12076.0 99.0 435.00 0.32 新媒体
7 融资 信用贷款 百度信息流 重庆 9742.0 110.0 387.12 0.32 新媒体
8 交易 网店交易 今日头条 平台创新中心 10300.0 84.0 1000.00 0.05 新媒体
9 交易 资质交易 今日头条 平台创新中心 5488.0 79.0 186.76 0.25 新媒体
三、总结
它的主作用还是数据的纵向合并,它和merge的纵向合并还是有点不同的,merge同一个数据合并,它的取交集,但是concat的同一个数据合并是取并集。
数据转换
重复数据
关于重复数据的操作用的是自带函数duplicated
1.查(返回布尔型数据)
一般与聚合函数一起使用
s3
业态 产品 推广平台 城市 展现量 点击量 消费 返点 推广方式
0 互联网 网站建设 神马搜索 杭州 10.0 1.0 9.45 0.35 网运
1 互联网 网站建设 神马搜索 长沙 7.0 0.0 0.00 0.35 网运
2 互联网 微信业务 搜狗搜索 杭州 6.0 1.0 1.26 0.35 网运
3 互联网 微信业务 神马搜索 杭州 15.0 1.0 7.27 0.35 网运
4 互联网 微信业务 神马搜索 长沙 5.0 1.0 14.94 0.35 网运
5 互联网 网站建设 神马搜索 杭州 10.0 1.0 9.45 0.35 网运
6 互联网 网站建设 神马搜索 长沙 7.0 0.0 0.00 0.35 网运
7 互联网 微信业务 搜狗搜索 杭州 6.0 1.0 1.26 0.35 网运
8 互联网 微信业务 神马搜索 杭州 15.0 1.0 7.27 0.35 网运
9 互联网 微信业务 神马搜索 长沙 5.0 1.0 14.94 0.35 网运
s3.duplicated()
0 False
1 False
2 False
3 False
4 False
5 True
6 True
7 True
8 True
9 True
dtype: bool
s3.duplicated().sum()
5
2.删(drop_duplicates(subset,keep,inplace)
它默认不会改变原始数据,除非让参数 inplace=True
当不指定列时,删除的时所有列都重复的,当给参数subset给定列名时,删除给定列重复的数据
keep:(first,last)它的作用是保留重复数据的第一个还是最后一个
s3.drop_duplicates()
业态 产品 推广平台 城市 展现量 点击量 消费 返点 推广方式
0 互联网 网站建设 神马搜索 杭州 10.0 1.0 9.45 0.35 网运
1 互联网 网站建设 神马搜索 长沙 7.0 0.0 0.00 0.35 网运
2 互联网 微信业务 搜狗搜索 杭州 6.0 1.0 1.26 0.35 网运
3 互联网 微信业务 神马搜索 杭州 15.0 1.0 7.27 0.35 网运
4 互联网 微信业务 神马搜索 长沙 5.0 1.0 14.94 0.35 网运
s3.drop_duplicates(['城市'])
业态 产品 推广平台 城市 展现量 点击量 消费 返点 推广方式
0 互联网 网站建设 神马搜索 杭州 10.0 1.0 9.45 0.35 网运
1 互联网 网站建设 神马搜索 长沙 7.0 0.0 0.00 0.35 网运
数据离散
cut 函数和qcut 函数(一维数据的切分)
x:要切分的数据(必须是一维的)
bins:分的组数;还可以是指定的切分点(列表形式)
labels:切分完的显示标签
qcut的参数和作用差不多,区别在于qcut可以让每个分组有相同个数的数据
bins=[-1,1,3,5,7,9]
labels=['低','一般低','中','高',]
ss=pd.cut(s,bins=4,labels=labels)
ss
a 低
b 低
c 低
d 一般低
e 一般低
a 中
b 中
c 高
d 高
e 高
dtype: category
Categories (4, object): [低 < 一般低 < 中 < 高]
数据的抽样提取
这里的抽样指的是基于index的提取
首先建一个随机数数组(基于numpy实现)
然后对数据进行基于indexde随机数数组的提取(take方法)
r=np.random.randint(0,len(s3),size=4)
r
array([7, 1, 4, 5])
s3.take(r)
业态 产品 推广平台 城市 展现量 点击量 消费 返点 推广方式
7 互联网 微信业务 搜狗搜索 杭州 6.0 1.0 1.26 0.35 网运
1 互联网 网站建设 神马搜索 长沙 7.0 0.0 0.00 0.35 网运
4 互联网 微信业务 神马搜索 长沙 5.0 1.0 14.94 0.35 网运
5 互联网 网站建设 神马搜索 杭州 10.0 1.0 9.45 0.35 网运
生成哑变量
哑变量在机器学习和统计建模中应用较多,都是对分类变量变成哑变量矩阵(对象是Series、array-like, or DataFrame)
用pandas库的get_dummies()
pd.get_dummies(s3.产品,prefix='产品',)
产品_微信业务 产品_网站建设
0 0 1
1 0 1
2 1 0
3 1 0
4 1 0
更改类型
astype()
s3.展现量.astype('int')
0 10
1 7
2 6
3 15
Name: 展现量, dtype: int32
字符串操作
1.替换
(replace(to_replace,value,inplace,limit=None,regex,method,))
to_replace:要被替换的字符串
value:替换的字符串
inplace:是否对原数据替换
它可以替换多个,用列表传参数,也可以不同数据替换不同结果,可以用字典传参数,也可以两个都用列表
s3.产品.replace('网站建设','设计',)
0 设计
1 设计
2 微信业务
Name: 产品, dtype: object
s3.产品.replace(['网站建设','微信业务'],['设计','业务'],)
0 设计
1 设计
2 业务
2.切分(split和strip)
对于str直接用方法,实际中对DataFrame 则.str.split
实际中的Series切分之后变成列表,所以它的提取也是列表的提取方法
s4['总']
0 互联网,网站建设 神马搜索
1 互联网,网站建设 神马搜索
2 互联网,微信业务 搜狗搜索
s4['总'].str.split(',')
0 [互联网, 网站建设 神马搜索]
1 [互联网, 网站建设 神马搜索]
2 [互联网, 微信业务 搜狗搜索]
s4['总'].str.split(',')[0][0]
'互联网'
实际中都是二者连用共同完成数据提取的工作
3.查找(find和index)/包含(contains)
两者都是查找字符串是否存在要查找的子串,区别在于,find没找到返回-1,index返回错误,涨到都是返回首字母的位置
实际中,可以利用find的返回值,反向索引出内容
好像index没法直接作用于Series
s4['总'][s4['总'].str.find('网站建设')]
4 互联网,微信业务 神马搜索
4 互联网,微信业务 神马搜索
-1 NaN
-1 NaN
-1 NaN
4 互联网,微信业务 神马搜索
4 互联网,微信业务 神马搜索
-1 NaN
-1 NaN
-1 NaN
Name: 总, dtype: object
4.增加(+和.join)
用于给字符串添加内容。
字符串的相关处理和正则表达式一起用的很多
例如对爬取的文本数据进行拆解提取
平时的数据最多的就是处理¥$这类的符号
分组聚合
Groupby函数
分组函数应用很灵活,参数一般用的就是分组依据参数,特别注意的是分组之后的聚合函数应用,可以是单个,也可以是多个,多个的时候要调用AGG方法
data1.groupby(['样式']).mean()
面积 price
样式
1室1厅 63.200000 1100.000000
2室1厅 75.600000 1140.000000
2室2厅 81.666667 1000.000000
data1.groupby(['样式','地址']).mean()
面积 price
样式 地址
1室1厅 三倒拐 48.0 500.0
堰山和畔二期 54.0 1300.0
岭秀都江1期 50.0 1300.0
岷江花园2期 110.0 1200.0
泰康博观 54.0 1200.0
2室1厅 九号花园 90.0 500.0
壹号街区 69.0 1000.0
府河名居(锦江) 89.0 2800.0
data1.groupby(['样式']).agg(['mean','sum'])
面积 price
mean sum mean sum
样式
1室1厅 63.200000 316 1100.000000 5500
2室1厅 75.600000 378 1140.000000 5700
2室2厅 81.666667 245 1000.000000 3000
3室1厅 97.000000 291 1162.666667 3488
3室2厅 100.750000 1209 860.500000 10326
4室2厅 138.500000 277 1100.000000 2200
透视、交叉表
透视表的应用之前有整理过。
pandas中透视表的应用
时间序列
时间序列分析(Time-Series Analysis)是指将原来的销售分解为四部分来看——
趋势、周期、时期和不稳定因素, 然后综合这些因素, 提出销售预测。强调的是通
过对一个区域进行一定时间段内的连续遥感观测,提取图像有关特征,并分析其变化
过程与发展规模。当然,首先需要根据检测对象的时相变化特点来确定遥感监测的周
期,从而选择合适的遥感数据。
时间序列基本操作
1.datetime库:构造时间数据
python的标准库datetime可用于创建时间数据类型。
1.datetime.date:表示日期的类
2.datetime.datetime:表示日期时间的类
3.datetime.time:表示时间的类
4.datetime.timedelta:表示时间间隔,即两个时间
点的间隔
2.时间数据字符串的相互转换
strftime():把时间格式转换成字符串
now.strftime(format="%Y-%m)
'2020-09-17'
strptime():把字符串转换成时间格
转换字符串成时间格式时必须格式一致:中间的间隔符以及时间显示格式
value='2020/12/18'
datetime.strptime(value,'%Y/%m/%d')
datetime.datetime(2020, 12, 18, 0, 0)
2.时间序列:构造时间序列和使用
使用pd.date_range函数可以创建指定长度的DatetimeIndex索引
主要参数:
start=None,开始时间
end=None,结束时间
periods=None,个数
freq=None,频率(天,小时,月,季度年等)
pd.period_range函数可以创建时期范围
主要参数和date_range一样
时间索引的移动
.shift()方法,默认频率是day
periods:移动周期
freq:移动频率
a=pd.date_range('2020-12-10','2020-12-25',)
a
DatetimeIndex(['2020-12-10', '2020-12-11', '2020-12-12', '2020-12-13',
'2020-12-14', '2020-12-15', '2020-12-16', '2020-12-17',
'2020-12-18', '2020-12-19', '2020-12-20', '2020-12-21',
'2020-12-22', '2020-12-23', '2020-12-24', '2020-12-25'],
dtype='datetime64[ns]', freq='D')
a.shift(2)
DatetimeIndex(['2020-12-12', '2020-12-13', '2020-12-14', '2020-12-15',
'2020-12-16', '2020-12-17', '2020-12-18', '2020-12-19',
'2020-12-20', '2020-12-21', '2020-12-22', '2020-12-23',
'2020-12-24', '2020-12-25', '2020-12-26', '2020-12-27'],
dtype='datetime64[ns]', freq='D')
补充:在shift中传入频率参数,会对索引造成修改,否则会对数据进行移动,出现NA值
3.频率转换与重采样:resample函数的使用
可通过asfreq方法对pd.period_range进行转换频率。
重采样是时间序列频率转换的处理过程。高频率聚合到低频率称为降采样,而低频率转换为高频率为升采样。
在降采样中,重点要考虑的是closed和label参数,这
两个参数分别表示哪边区间是闭合的,哪边用于标记。