数据处理的常用操作

最近发现有些知识以为自己会,用的时候又有点模糊,没办法,抽空整理下,一方面加深自己的记忆,另一方面,下次也有个地方可以查找。

数据规整化

合并数据

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
样式		
1163.200000	1100.000000
2175.600000	1140.000000
2281.666667	1000.000000
data1.groupby(['样式','地址']).mean()
		面积	price
样式	地址		
11厅	三倒拐	48.0	500.0
堰山和畔二期	54.0	1300.0
岭秀都江150.0	1300.0
岷江花园2110.0	1200.0
泰康博观	54.0	1200.0
21厅	九号花园	90.0	500.0
壹号街区	69.0	1000.0
府河名居(锦江)	89.0	2800.0
data1.groupby(['样式']).agg(['mean','sum'])
	面积	price
mean	sum	mean	sum
样式				
1163.200000	316	1100.000000	5500
2175.600000	378	1140.000000	5700
2281.666667	245	1000.000000	3000
3197.000000	291	1162.666667	3488
32100.750000	1209	860.500000	10326
42138.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参数,这
两个参数分别表示哪边区间是闭合的,哪边用于标记。

重采样解析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值