开发者学堂课程【Python 常用数据科学库:Pandas 常用操作1】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/546/detail/7489
Pandas 常用操作1
内容介绍
一、数据排序
二、去掉重复数据
三、做映射合并同类项
一、数据排序
1、在 panda 当中,经常会用到的一些操作,这个操作算不上是大操作,本节就相当于是做一个大串讲,把一些常见的东西过一遍,以后用起来的时候能想到有这样的东西,这个用起来是比较方便的。
2、首先构造一个数据,data 等于df,df 里构造一个数据,再用个字典形式,字典形式里有两个列,第一个列叫 group,给它指定一个名字,指定完名字之后,赋予一些值,比如有 a a a b b b c c c ,这就是当前的一个列。第二列叫 data,随便写一些值4 3 2 1 12 3 4 5 7
import pandas as pd
data =pd. DataFrame({'group':['a',' a','a'.'b','b','c','c','c'],
'data':[4,3,2,1,12,3,4,5,7})
data
执行这就是当前的一个数据
3、要对这个数据执行一些操作,比如现在想按照最基本的方式进行排序的操作。可以 data 点 sort_values,然后里面可以传进来在执行这个操作的时候是按照什么样的列去执行什么样的操作。
在这里,可以 by group,这是第一列,第一列要参加到计算当中,第二列也要参加到计算当中,对于这两列可以按照一个顺序去指定,按照的顺序是第一个列在降序的条件下,并且第二个列在升序的条件下,也就是说 group 应该是按照降序排列,就是 c b a 这样的顺序, data 是按照从小到大的顺序,在这里可以分别指定。by 指定完后,指定升降序,升序指定成 False,相当于是 group 要进行降序,然后 data 要进行升序,升序指定成 True。然后还指定一个 inplace,inplace 等于 True,相当于是在原始数据上进行改变。
data.sort_values(by=['group'.'data'],ascending=[Palse,True],inplace=True)
data 然后再执行一下,看一下结果, group 这个列是按照降序是 cba 的顺序,在保证group 是降序的前提下, data 是一个升序的4,5,7,1,3,12,2,3,4。
4、这样就构造出来一个数据,按照升序或者是降序的顺序可以把数据进行一个排列组合。可以在这里指定按照什么去排序,它升降序方式是什么样子的,inplace 值一般可以指定成 True,这就是最基本的一个排序的操作。
二、去掉重复数据
1、可以单独按照某一个键去排序,排完序之后,就会发现一个问题,比如有一些重复的值,重复的值可能就是没有什么用的,可以去掉这些重复的东西。
2、构造另外一个 data,还是构造一个 DataFrame 结构,在 DataFrame 结构当中,还是指定一些数据,有一个 k1,k1里有3个 one,4个 two;还有 k2—3,2,1,3,3,4,4
data = pd.DataFrame({'k1':[' one']*3+[' two']*4,
'k2':[3,2, 1,3,3, 4,4]})
data
指行看一下 data 长什么样子,这个就是数据有 k1,k2两列, k1里它只有 one 和two 这个东西,k2里它有一些值。这回还要对数据进行排序,刚才指定了两个列算出来的,这次指定一个列,按照从小到大去排
data. sort_values(by=’k2’)
执行一下
一列也是可以排的,可以按照k2去进行排序,也可以按照k1进行排序,这些都是没有问题的。
3、现在排序完之后发现一个事,上图有两个一模一样的 two 4,对于这种一模一样的值来说, 它是一个重复的值,重复的值可以去掉,可以直接 drop 一下当前的重复值,重复值给它写出来
看一下结果,就看这个 two4 能不能被去掉.
data.drop_duplicates()
执行一下,原来是有七个数据,现在把重复的都去掉了, two 3和 two 4原来分别有两个,现在 two3和 two 4都是分别只有一个,这个就是把重复的数据去掉了,这个操作以后都可以用。
4、看一下这个是按照什么样的方式去重的,现在的方式只是 k1、k2都一样才去重。这里也指定只要 k1里有重复的就去掉,只想保留一。可以指定一个 subset,subset里传进来一个 k1
data.drop_duplicates(subset='k1')
看一下结果, k1里只有两个值 one 和 two,因为无论 one 出现几次,指定的 subset 里都是以 k1为基准的, k1里不重复的只有一个 one 一个 two。
三、做映射合并同类项
1、重新构造一个 DataFrame 结构,DataFrame 里再传进来一些其它值,比如现在有一些蔬菜,分成了几个大类 A1,A2,B1,B2,B3,C1,C2
蔬菜里有一些营养成分,写一个 data, data 里有一些值——1234567,
给它指定 data
data = pd. DataFrame({'food':['A1','A2','B1','B2','B3','C1','C2'],'data':[1,2,3,4,5,6,7})
data
把 data 打印一下,这是当前的数据,有A1,A2,B1,B2,B3,C1,C2
,数据当中有1234567这几个值。现在构造的这个数据里,它里面有 A1,A2,想给它进行同类项的合并,相当于把值做一个映射,A1,A2都归为 A,B1,B2,B3 都归为 B,C1,C2都归为 C。这里可以 def 一个函数 food_map,在做映射的函数的时候,得传进来 series 结构,然后在这里去做映射。如果传进来的 series 当中,food 等于A1就返回一个值 A,如果等于 A2,也返回 A,以此类推,先写完这样一个函数,就可以做这个映射了。
2、在 data 数据当中,指定新的一列叫做 food_map,food_map 等于 apply,apply 相当于可以对数据当中它的每一行或者是每列都执行同样的操作。再传进来一个值,需要按照一个轴去做,用 apply 去做的时候不需要再指定具体某个列了,因为这是一个 data,它会在这个行当中自动的判断,所以这里用 map 是不行的,用apply 是可以的。
def food map(series):
if series['food'] =='A1':
return’A'
elif series[' food']=='A2':
return’A'
elif series[' food'] =='B1':
return’B'
elif series['food'] =='B2':
return'B'
elif series['food'] =='B3':
return'B'
elif series['food'] =='C1':
return'C'
elif series['food'] =='C2':
return'C'
data[' food map'] = data.apply(food_map,axis ='columns')
data
执行一下,A1,A2都变成 A 了,B1,B2,B3都变成 B了,C1,C2都变成 C 了,这是一个apply 函数。apply 函数相当于是对每一条数据、每个样本都执行了这样一个操作,会看每个样本是什么,然后给它返回一个新的值,之后也会单独再去说这个,到时候还会举几个例子。
3、要有这个概念,有这样一个 apply 函数,可以对数据当中每一个样本都执行相同的操作,然后这个操作需要自己先定义好一个函数,传进来这个函数就能做这个事了,这个就是 apply 函数。
4、用 map 的时候,需要写成一种字典结构的定义,map 里写的是一一对应的关系。这里可以这么写,比如说 A1它是转换成 A,B1 转换成 B,C1 转换成 C,这样就做好了一个字典映射。data 里重新传进来一个列就叫做 upper,等于 data 数据当中的 food,对它执行 map 操作,然后把这个字典传进去,这才是一个 map 操作。
food2Upper {
'A1' :'A'
'A2' :'A'
'B1' :'B’.
'B2' :'B'
'B3: 'B',
'C1': 'C',
'C2': 'C'
data['upper']=data['food'].map(food2Upper)
data
执行看一下结果是什么样子,这次也是做了一个映射,upper 做映射 A1转换成 A,A2转换成 A,B1,B2,B3都转换成了 B,C1,C2都转成 C,这就是一个字典映射。
5、要做.map 操作,需要指定一个字典,要执行 apply 操作需要自己指定一个函数,这两个是稍微有区别的。apply 用的更广,因为它不光能去做映射,还是在很多方面去执行类似的一些操作的。