数值操作
数值替换
一对一替换
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