开发者学堂课程【Python 常用数据科学库:Pandas 常用操作2】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/546/detail/7490
Pandas 常用操作2
内容介绍
一、按要求构造数据
二、bins 分组
三、填充缺失值
一、按要求构造数据
1、当构造一个新的列的时候,不光可以指定这个列名,也可以用一个 DataFrame 的操作。重新再构造一个 pandas 结构,在 DataFrame 中重新指定一些值:data1, data2,这样就构造出来一个数据,五个数据构造完之后,要构造一个新的值或者新的特征。这个新特征它的名字叫做 ration,就是一个比例,它等于 DataFrame 里的data1,把 data1一传进去,要它等于 data1和 data2 的比值,看这样能不能把这个数据构造出来。
import numpy as np
df=pd.DataFrame({'data1':np.random.randn(5),
data2':np.random.randn(5})
df.assign(ration =df['datal']/df['data2'])
执行看一下当前结果,也就是说可以直接通过这样的操作,在数据当中加上这么一个列,可以自己指定列名,也可以直接 assign 一下,然后指定列是等于其它的什么计算。
2、当做完了这个数据之后,想去掉 drop 一下就可以,比如说想把刚才做的这个东西给它 drop 掉,drop 的时候指定把它整个列都去掉,然后 inplace 等于 True 值
df2.drop('ration',axis='columns’,inplace=True)
然后再执行一下,结果确实就给它 drop 掉了。
3、这就是可以去掉一个数据,在去掉数据的时候,也可以进行替换。比如说定义data 等于 pandas 点 Series 结构,Series 结构里随便传一些值,比如说123456789
data=pd.Series([1,2,3,4,5,6,7,8,9])
data
执行得到 data。
有了这样一个数据之后, 输入 replace,替换 data 中的值,比如9这个值不想要了,想替换成 np.nan 这个格式,然后指定一个 in place 等于 True 值
data.replace(9,np. nan.inplace-True)
执行这样就把9这个值替换掉了,也可以在列或者行当中去替换一个值,这些都是可以的。
4、可以去替换一个值,也可以替换多值,替换多值写成一个 list 传进去,就可以了,所以可以执行很多种替换的方式。比如现在有一个年龄的数据, 15,18、20、21、22, 34,41,52,64, 79,接下来要把这个年龄数据给它划分到一个一个的组当中,相当于把连续值进行一个离散化。需要指定离散化的一个区间,比如指定bins,里面写上10~40,40~80,分成两个组。然后要对数据执行一个操作,这个时候也可以用 pandas 去完成。bins_res 就等于 pandas 点 cut,把 ages 进行切分,按照刚才设计的 bins 去切分
ages =[15,18, 20, 21,22,34,41,52,63,79]
bins = [10, 40, 80]
bins_res=pd.cut(ages,bins)
bins_res
看一下结果吧, 结果第一个数据是10~40,第二个是10~40,一直到41这个值才是40~80,也就是把数据分割成了这么多组,每个组其实就是两个 bins,一个是10~41一个是40~80,得到这样一个结果。
二、bins 分组
1、 对于这个结果来说,还可以调一下它的一些属性,比如说可以看它的 labels,bins_res.labels labels 就相当于是当前 bins 它的结果是属于第几个,这里现在只有10~40和40~80,所以 labels 里只有0和1,0和1相当于把原始数据做了一个映射,映射到了两个区间,然后又对区间做了一个编码。
2、所以在之后去构造一些特征的时候,也经常会用到 bins 分组的一个特性的,除了labels,还可以调 pandas 点 value_counts, 在 value_counts 里传进来pd.value_counts(bins_res)
看一下当前的结果,当前在这个10~40这个区间里有6个,在40~80这个区间里有4个,也就是说不光能把每个值调出来它是属于某一个区间的,还可以去统计一下当前这个区间一共有多少个值。
3、也可以在pandas cut里把ages值拿进来,可以自己写区间对它进行区分,写个10~30,30~50,50~80这样一个区间
pd.cut(ages[10,30,50,80])
也就是说可以把这个东西写成一个 bins,也可以把直接传进来,这些都是没有什么问题的,这样我就得到当前的一个结果。
4、当 cut 的时候,也可以指定切分之后组的名字。写 group_names,分组的名字里比如说有个比较年轻的 youth,还有一个 mille 还有一个 old 的吧,分成三个组,指定完组的名字之后,pandas.cut 一下,把 ages 传进来,然后在 ages 里自己指定bins,年轻的就是10~20,稍微中等一些的20~50,然后50~80,指定这样一个区间,bins 指定完之后,可以再指定一个 labels,让 labels 等于 group_names,在value_counts 里看更直接一些,然后直接 pd.cut 传到这里
group_names =['Yonth',' Mille','0ld']
pd.value_counts (pd.cut(ages,[10,20,50,80],labels=group_names)
执行一下。mille 里有四个人,old 有三个人,youth 有三个人,也就是在 cut 的时候也可以指定当前的一个别名,相当于换个 bins,换完 bins 之后告诉这个 bins 叫什么名字。
三、填充缺失值
1、下面还是构造一个 DataFrame ,当数据当中有一些缺失值的时候,在 DataFrame 当中,随便构造一个 range 3,后面还可以加上一些值,比如0,np.nan,0。再加上一个数据0,0,np.nan,有一些却是值,这里再加一个 range
df = pd.DataFrame( range(3), [0, np.nan,0], [0,0, np. nan],range (3))
df
然后执行一下,这里就随便构造了一些数据,012,有的带一些缺失值,那有缺失值的时候该怎么样去查找一下数据中是不是有这个缺失值,可以用 df.isnull(),先来执行一下,打印 False 的就说明它不是缺失值,打印 True 的就是是缺失值,相当于把原始数据拿过来了,只不过说用一种布尔类型把这个数据进行了一个替换。
2、这里可能想看的就是哪一行它有一个缺失值,比如说现在这些数据当中,可以按照行或者按照列来进行指定。
df.isnull().any()
先直接执行一下,它会告诉012列是否有缺失值,第一列没有缺失值,第二列有,第三列也有,这是直接点 isnull,它有默认值的,这是按照列去看,按照行去看需要再指定一下
df.isnull().any(axis=1)
执行零行第一行有第二行有第三,通过 isnull.any 就可以看一下当前数据当中是不是有缺失值。
3、如果有缺失值,可以去 fillna 一下:df. fillna(5),执行一下,就是有缺失值的地方,拿数值5进行了一个填充,这里可以拿一个单独的值或者可以去算一下当前某一列的均值,中位数,或者众数什么的,可以按照任意的指标去指定,有缺失值可以把缺失值填充一下。
4、然后这里把缺失值的位置找到,相当于制定一个索引结构,把索引结构回传到DataFrame 当中,这样就找到了那些带缺失值的行,就是把缺失值做一个定位,定位完之后就可以展现出来,就可以观察缺失值是什么,再去 fillna 填充缺失值,关于这个缺失值,有一些操作可以找缺失值,然后也可以对缺失值进行基本的填充的操作。