Python数据分析--数值操作

本文介绍了Python数据分析中的数值操作,包括数值替换(一对一、多对一、多对多)、数值排序(按列、按多列)、数值排名、数值删除(列、行、特定行)、数值计数、唯一值获取、数值查找、区间切分、插入新列、行列互换、索引重塑、长宽表转换以及apply()和applymap()函数的应用。

数值替换

一对一替换

replace(A,B)表示将A替换成B

df
>>>
    编号	年龄	   性别	注册时间
0	A1	54.0	男	2018-08-08
1	NaN	NaN    NaN	NaT
2	A3	47.0	女	NaT
3	A4	41.0	男	2018-08-11

df.replace(54,23)  #将54替换成23
>>>
   编号	年龄	   性别	注册时间
0	A1	23.0	男	2018-08-08
1	NaN	NaN 	NaN	NaT
2	A3	47.0	女	NaT
3	A4	41.0	男	2018-08-11

df.replace(np.NaN,0) #将缺失值替换成0
>>>
   编号	年龄	性别	    注册时间
0	A1	54.0	男	2018-08-08 00:00:00
1	0	0.0	    0	0
2	A3	47.0	女	0
3	A4	41.0	男	2018-08-11 00:00:00                      

多对一替换

replace([A,B],C)将A、B替换成C

df.replace([54,47],23)
>>>
    编号	年龄	   性别	注册时间
0	A1	23.0	男	2018-08-08
1	NaN	NaN 	NaN	NaT
2	A3	23.0	女	NaT
3	A4	41.0	男	2018-08-11

多对多替换

df.replace({54:23,'女':'男'})
>>>
   编号	年龄	   性别	注册时间
0	A1	23.0	男	2018-08-08
1	NaN	NaN	   NaN	NaT
2	A3	47.0	男	NaT
3	A4	41.0	男	2018-08-11

数值排序

按照一列数值排序

df.sort_values(by = ['col'],ascending = False
  • ascending = False表示按照coll列进行降序排列
  • ascending 默认值为True,表示升序排列
df.sort_values(by = ['年龄'])
>>>
   编号	年龄	   性别	注册时间
3	A4	41.0	男	2018-08-11
2	A3	47.0	女	NaT
0	A1	54.0	男	2018-08-08
1	NaN	NaN 	NaN	NaT

na_position对缺失值位置进行设置,默认为last

df.sort_values(by = ['年龄'],na_position = 'first')
>>>
    编号	年龄 	性别	注册时间
1	NaN	NaN 	NaN	NaT
3	A4	41.0	男	2018-08-11
2	A3	47.0	女	NaT
0	A1	54.0	男	2018-08-08

按照多列数值排序

df.sort_values(by = ['col1','col2'],ascending = [True,False])
  • 先按照col1列升序,当col1遇到重复,按照col2降序
df
>>>
   编号	性别	注册时间	   年龄
一	A1	男	2018-08-08	54
二	A2	女	2018-08-09	16
三	A3	女	2018-08-10	47
四	A4	男	2018-08-11	41
四	A5	女	2018-08-09	16

df.sort_values( by = ['年龄','编号'], ascending = [False,True])
>>>
   编号	性别	注册时间	   年龄
一	A1	男	2018-08-08	54
三	A3	女	2018-08-10	47
四	A4	男	2018-08-11	41
二	A2	女	2018-08-09	16
四	A5	女	2018-08-09	16

数值排名

在Python中对数值进行排名,使用rank()方法。rank()主要有两个参数,一个是ascending用来指明升序排序还是降序排序,默认升序,另一个method用来指明排列值有重复值的处理情况。
metho可取不同参数值及说明:

method说明
average当排名的数值有重复值时,返回重复值的平均排名
first按值在所有的待排序数据中出现的先后顺序排名
min当排名的数值有重复值时,返回重复值的最佳排名
average当排名的数值有重复值时,返回重复值的最大排名
df['编号']
>>>
0    1
1    2
2    1
3    2
4    3
Name: 编号, dtype: int64

df['编号'].rank(method = 'average')
>>>
0    1.5
1    3.5
2    1.5
3    3.5
4    5.0
Name: 编号, dtype: float64

df['编号'].rank(method = 'first')
>>>
0    1.0
1    3.0
2    2.0
3    4.0
4    5.0
Name: 编号, dtype: float64

df['编号'].rank(method = 'min')
>>>
0    1.0
1    3.0
2    1.0
3    3.0
4    5.0
Name: 编号, dtype: float64

df['编号'].rank(method = 'max',ascending = False)
>>>
0    5.0
1    3.0
2    5.0
3    3.0
4    1.0
Name: 编号, dtype: float64

数值删除

删除列

  • drop()直接传入待删除的列名或位置,axis = 1 表示删除列
df.drop(['编号','注册时间'] ,axis = 1)  # 直接删除待删除列的列名
>>>
   性别	年龄
0	男	54
1	女	16
2	女	47
3	男	41
4	女	16

df.drop( df.columns[[1,3]] ,axis = 1)  #直接传入待删除的位置
>>>
   编号	注册时间
0	1	2018/8/8
1	2	2018/8/9
2	1	2018/8/10
3	2	2018/8/11
4	3	2018/8/9
  • 将列名以列表形式传给columns参数,不需要axis参数
df.drop(columns = ['编号','注册时间'])
>>>
   性别	年龄
0	男	54
1	女	16
2	女	47
3	男	41
4	女	16

删除行

  • drop()直接传入待删除的行名,axis = 0表示删除行
df.drop([2,3], axis = 0) #直接传入行名
>>>
   编号	性别	注册时间	   年龄
0	1	男	2018/8/8	54
1	2	女	2018/8/9	16
4	3	女	2018/8/9	16

df.drop(df.index[[0,1]], axis = 0) # 直接传入行号
>>>
   编号	性别	注册时间    年龄
2	1	女	2018/8/10	47
3	2	男	2018/8/11	41
4	3	女	2018/8/9	16
  • 将待删除的行名传给index参数
df.drop(index = [3,4])
>>>
   编号	性别	注册时间 	年龄
0	1	男	2018/8/8	54
1	2	女	2018/8/9	16
2	1	女	2018/8/10	47

删除特定行

Python删除特定行是把不满足条件的值筛选出来作为新的数据源

df[ df['年龄'] >40] # 删除年龄小于40
>>>
   编号	性别	注册时间	   年龄
0	1	男	2018/8/8	54
2	1	女	2018/8/10	47
3	2	男	2018/8/11	41

数值计数

计算某个值在一系列数值中出现的次数

df['年龄'].value_counts()
>>>
16    2
47    1
54    1
41    1
Name: 年龄, dtype: int64

# 不同值的占比情况,并降序排列
df['年龄'].value_counts(normalize = True , sort = False)
>>>
16    0.4
41    0.2
54    0.2
47    0.2
Name: 年龄, dtype: float64

唯一值获取

df['年龄'].unique()
>>>
array([54, 16, 47, 41])

数值查找

# 针对全表查找是否包含某个值
df.isin([54,53]) #全表是否包含54 53两个值
>>>
    编号 	性别	   注册时间	年龄
0	False	False	False	True
1	False	False	False	False
2	False	False	False	False
3	False	False	False	False
4	False	False	False	False

# 针对某一列查找是否包含某个值
df['年龄'].isin([54,53])
>>>
0     True
1    False
2    False
3    False
4    False
Name: 年龄, dtype: bool

区间切分

  • cut()方法切分是左开右闭区间,参数bin用来指明切分区间
df
>>>
   年龄
0	1
1	2
2	3
3	4
4	5
5	6
6	7
7	8
8	9
9	10

pd.cut(df['年龄'] , bins = [0,3,6,10])
>>>
0     (0, 3]
1     (0, 3]
2     (0, 3]
3     (3, 6]
4     (3, 6]
5     (3, 6]
6    (6, 10]
7    (6, 10]
8    (6, 10]
9    (6, 10]
Name: 年龄, dtype: category
Categories (3, interval[int64]): [(0, 3] < (3, 6] < (6, 10]]
  • qcut()方法不需要指明切分区间,只需要指明切分个数
# 将数据切成3份
pd.qcut(df['年龄'] ,3)
>>>
0    (0.999, 4.0]
1    (0.999, 4.0]
2    (0.999, 4.0]
3    (0.999, 4.0]
4      (4.0, 7.0]
5      (4.0, 7.0]
6      (4.0, 7.0]
7     (7.0, 10.0]
8     (7.0, 10.0]
9     (7.0, 10.0]
Name: 年龄, dtype: category
Categories (3, interval[float64]): [(0.999, 4.0] < (4.0, 7.0] < (7.0, 10.0]]
  • 数据分布均匀的情况下,cut()和qcut()得到的区间基本一致,当数据分布不均匀,即方差比较大时,两者的区间偏差就会比较大

插入新的列

insert()指明要插入的位置、插入后新列的列名、插入的数据

df
>>>
编号	年龄	性别	注册时间
0	A1	54	男	2018-08-08
1	A2	16	女	2018-08-09
2	A3	47	女	2018-08-10
3	A4	41	男	2018-08-11

df.insert(1 , '姓名' , ['张三','李四','王五','六六'])
df
>>>
   编号	姓名	年龄	性别	注册时间
0	A1	张三	54	男	2018-08-08
1	A2	李四	16	女	2018-08-09
2	A3	王五	47	女	2018-08-10
3	A4	六六	41	男	2018-08-11

以索引方式直接插入到最后一列

df['商品'] = ['coat1','coat2','coat3','coat4']
>>>
	编号	姓名	年龄	性别	注册时间  	商品
0	A1	张三	54	男	2018-08-08	coat1
1	A2	李四	16	女	2018-08-09	coat2
2	A3	王五	47	女	2018-08-10	coat3
3	A4	六六	41	男	2018-08-11	coat4

行列互换

df.T #转置
>>>
	0	1	2	3
编号	A1	A2	A3	A4
姓名	张三	李四	王五	六六
年龄	54	16	47	41
性别	男	女	女	男
注册时间	2018-08-08 00:00:00	2018-08-09 00:00:00	2018-08-10 00:00:00	2018-08-11 00:00:00
商品	coat1	coat2	coat3	coat4

df.T.T
>>>
   编号	姓名	年龄	性别	注册时间	            商品
0	A1	张三	54	男	2018-08-08 00:00:00	coat1
1	A2	李四	16	女	2018-08-09 00:00:00	coat2
2	A3	王五	47	女	2018-08-10 00:00:00	coat3
3	A4	六六	41	男	2018-08-11 00:00:00	coat4

索引重塑

  • 将表格型数据转换到树形数据
df.stack()
>>>
0  编号                       A1
   姓名                       张三
   年龄                       54
   性别                        男
   注册时间    2018-08-08 00:00:00
   商品                    coat1
1  编号                       A2
   姓名                       李四
   年龄                       16
   性别                        女
   注册时间    2018-08-09 00:00:00
   商品                    coat2
2  编号                       A3
   姓名                       王五
   年龄                       47
   性别                        女
   注册时间    2018-08-10 00:00:00
   商品                    coat3
3  编号                       A4
   姓名                       六六
   年龄                       41
   性别                        男
   注册时间    2018-08-11 00:00:00
   商品                    coat4
dtype: object
  • 将树形数据转换为表格型数据
df.stack().unstack()
>>>
   编号	姓名	年龄	性别	注册时间         	商品
0	A1	张三	54	男	2018-08-08 00:00:00	coat1
1	A2	李四	16	女	2018-08-09 00:00:00	coat2
2	A3	王五	47	女	2018-08-10 00:00:00	coat3
3	A4	六六	41	男	2018-08-11 00:00:00	coat4

长宽表转换

宽表转换为长表

df
>>>
  Company	Name	Sale2013	Sale2014	Sale2015	Sale2016
0	Apple	苹果	    5000    	5050	    5050	    5050
1	Google	谷歌	    3500	    3800	    3800	    3800
2	Facebook脸书	    2300	    2900	    2900	    2900

df.melt(id_vars = ['Company' , 'Name'])
>>>
   Company	Name variable	value
0	Apple	苹果	Sale2013	5000
1	Google	谷歌	Sale2013	3500
2	Facebook脸书	Sale2013	2300
3	Apple	苹果	Sale2014	5050
4	Google	谷歌	Sale2014	3800
5	Facebook脸书	Sale2014	2900
6	Apple	苹果	Sale2015	5050
7	Google	谷歌	Sale2015	3800
8	Facebook脸书	Sale2015	2900
9	Apple	苹果 Sale2016	5050
10	Google	谷歌	Sale2016	3800
11	Facebook脸书	Sale2016	2900

长表转换为宽表

df
>>>
   Company	Name variable	value
0	Apple	苹果	Sale2013	5000
1	Google	谷歌	Sale2013	3500
2	Facebook脸书	Sale2013	2300
3	Apple	苹果	Sale2014	5050
4	Google	谷歌	Sale2014	3800
5	Facebook脸书	Sale2014	2900
6	Apple	苹果	Sale2015	5050
7	Google	谷歌	Sale2015	3800
8	Facebook脸书	Sale2015	2900
9	Apple	苹果 Sale2016	5050
10	Google	谷歌	Sale2016	3800
11	Facebook脸书	Sale2016	2900

df.pivot_table(index = ['Company','Name'] ,columns = 'year',values = 'sale')
>>>
  Company	Name	Sale2013	Sale2014	Sale2015	Sale2016
0	Apple	苹果	    5000    	5050	    5050	    5050
1	Google	谷歌	    3500	    3800	    3800	    3800
2	Facebook脸书	    2300	    2900	    2900	    2900

apply()与applymap()函数

  • apply()对某一column或row中的元素执行相同函数操作
df
>>>
    Z1	Z2	C1	C2
0	36	37	1	2.2
1	47	9	3	4.6
2	28	92	5	6.4
3	9	2	7	8.9


# 对C1列每个元素都加1
df['C1'].apply(lambda x : x+1)
>>>
0    2
1    4
2    6
3    8
Name: C1, dtype: int64
  • applymap()对每一个元素执行相同的函数操作
# 每个元素都加1
df.applymap( lambda x : x+1)
>>>
    Z1	Z2	C1	C2
0	37	38	2	3.2
1	48	10	4	5.6
2	29	93	6	7.4
3	10	3	8	9.9
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值