小白也能看懂的Pandas实操演示教程(下)

今天 主要带大家来实操学习下Pandas,因为篇幅原因,分为了两部分,本篇为下。上篇内容见:

5 pandas实现SQL操作

pandas实现对数据的增删改查

增:添加新行或增加新列

dict={'Name':['LiuShunxiang','Zhangshan'],
    'Sex':['M','F'],
    'Age':[27,23],
    'Height':[165.7,167.2],
    'weight':[61,63]}
print(dict)
student1=pd.DataFrame(dict)
print(student1)

dict={'Name':['Liu','Zhang'],
    'Sex':['M','F'],
    'Age':[27,23],
    'Height':[165.7,167.2],
    'weight':[61,63]}
student2=pd.DataFrame(dict)
{'Name': ['LiuShunxiang', 'Zhangshan'], 'Sex': ['M', 'F'], 'Age': [27, 23], 'Height': [165.7, 167.2], 'weight': [61, 63]}
   Age  Height          Name Sex  weight
0   27   165.7  LiuShunxiang   M      61
1   23   167.2     Zhangshan   F      63

将student2中的数据新增到student1中,可以通过concat函数实现,concat函数对index无视

student3=pd.concat([student1,student2],ignore_index='Ture') 
student3
640?wx_fmt=png
添加新列---增加的新列没有赋值,就会出现NAN的形式
pd.DataFrame(student2,columns=['Age','Heught','Name','Sex','weight','Score'])
640?wx_fmt=png

删:删除表、观测行或变量列

删除整个数据框
del student2
student2
---------------------------------------------------------------------------

NameError                                 Traceback (most recent call last)

<ipython-input-61-dbecb61e032f> in <module>()
----> 1 student2


NameError: name 'student2' is not defined
删除指定行
student3.drop([0])
删除25岁以上的学生
student3[student3['Age']<25]
640?wx_fmt=png
删除指定的列
student3.drop(['Height','weight'],axis=1)
640?wx_fmt=png

不论删除行还是列,都可以通过drop方法实现,只需要设定好删除的轴即可,即调整drop方法中的axis参数。默认参数为0,即删除行观测数据,如果需要删除列变量,则需要设置为1.

改:修改原始记录的值

如果发现表中的数据错了,如何更改原来的值呢?尝试结合布尔索引和赋值的方法

student3
640?wx_fmt=png

假设需要修改liu学生的身高为173

student3.loc[student3['Name']=='Liu','Height']=173
student3
640?wx_fmt=png

查:类似上边的数据查询部分

聚合:groupby()
student3.groupby('Sex').mean()
640?wx_fmt=png

多个分组变量,例如根据年龄和性别分组,计算身高和体重的平均值

student3.groupby(['Sex','Age']).mean()
640?wx_fmt=png

对每个分组计算多个统计量

student3.drop('Age',axis=1).groupby('Sex').agg([np.mean,np.median])
640?wx_fmt=png

排序:sort_values

series=pd.Series(np.array(np.random.randint(1,20,10)))
series
0     3
1    13
2    13
3    17
4     5
5    15
6    17
7    15
8     4
9    16
dtype: int32
默认按值升序排列
series.sort_values()
0     3
8     4
4     5
1    13
2    13
5    15
7    15
9    16
3    17
6    17
dtype: int32
按降序排列
series.sort_values(ascending=False)  
6    17
3    17
9    16
7    15
5    15
2    13
1    13
4     5
8     4
0     3
dtype: int32
数据框中按值排列
student3.sort_values(by=['Sex','Age'])
640?wx_fmt=png
多表链接-merge
dict2={'Name':['Alfred','Alice','Barbara','Carol','Henry','Jeffrey','Judy','Philip','Robert','william'],
      'Score':[88,76,89,67,79,90,92,86,73,77]}
score=pd.DataFrame(dict2)
score
640?wx_fmt=png

student3['Name']=['Alfred','Alice','Barbara','Carol']
student3
640?wx_fmt=png

把学生表和成绩表做一个关联,默认情况下实现的是两个表之间的内连接,即返回两张表中共同部分的数据

stu_score1=pd.merge(student3,score,on='Name') 
stu_score1
640?wx_fmt=png

stu_score1=pd.merge(student3,score,on='Name',how='inner') 
stu_score1
640?wx_fmt=png

使用how参数设置连接的方式,left为左连接,right为右连接,outer为外连接

stu_score2=pd.merge(student3,score,on='Name',how='left')  
stu_score2
640?wx_fmt=png

保留score表中的所有信息,同时将student3表的信息与之配对,能配多少配多少,对于没有配上的score,将会显示Nan

stu_score3=pd.merge(student3,score,on='Name',how='right')  
stu_score3
640?wx_fmt=png

stu_score4=pd.merge(student3,score,on='Name',how='outer')  
stu_score4
640?wx_fmt=png

6 对缺失值的处理

现实中的数据存在很多噪音的同时,缺失值也非常的常见。缺失值的存在会影响后期的数据分析或挖掘工作,那么缺失值的处理有哪些方法呢?

6.1 删除法

当数据中某个变量大部分值都会缺失值时,可以考虑删除该变量; 默认情况下,dropna会删除任何含有缺失值的行,  构造个数据框

df=pd.DataFrame([[1,1,2],[3,5,np.nan],[13,21,34],[55,np.nan,10],
                [np.nan,np.nan,np.nan],[np.nan,1,2]],columns=['x1','x2','x3'])
df
640?wx_fmt=png

df.dropna()
640?wx_fmt=png
只删除所有行为缺失值的观测
df=pd.DataFrame([[1,1,2],[3,5,np.nan],[13,21,34],[55,np.nan,10],
                [np.nan,np.nan,np.nan],[np.nan,1,2]],columns=['x1','x2','x3'])
df.dropna(how='all')  
640?wx_fmt=png
删除有行为缺失值的观测,
df=pd.DataFrame([[1,1,2],[3,5,np.nan],[13,21,34],[55,np.nan,10],
                [np.nan,np.nan,np.nan],[np.nan,1,2]],columns=['x1','x2','x3'])
df.dropna(how='any')
640?wx_fmt=png
删除全为nan的那些列
df=pd.DataFrame([[1,1,2,np.nan],[3,5,np.nan,np.nan],[13,21,34,np.nan],[55,np.nan,10,np.nan],
                [np.nan,np.nan,np.nan,np.nan],[np.nan,1,2,np.nan]],columns=['x1','x2','x3','x4'])
print(df)
df.dropna(how='all',axis=1) 
     x1    x2    x3  x4
0   1.0   1.0   2.0 NaN
1   3.0   5.0   NaN NaN
2  13.0  21.0  34.0 NaN
3  55.0   NaN  10.0 NaN
4   NaN   NaN   NaN NaN
5   NaN   1.0   2.0 NaN
640?wx_fmt=png
利用thresh,保留一些为nan的值

行方向上至少有3个非NAN的项保留

df=pd.DataFrame([[1,1,2,np.nan],[3,5,np.nan,np.nan],[13,21,34,np.nan],[55,np.nan,10,np.nan],
                [np.nan,np.nan,np.nan,np.nan],[np.nan,1,2,np.nan]],columns=['x1','x2','x3','x4'])
df.dropna(thresh=3) 
640?wx_fmt=png

df=pd.DataFrame([[1,1,2,np.nan],[3,5,np.nan,np.nan],[13,21,34,np.nan],[55,np.nan,10,np.nan],
                [np.nan,np.nan,np.nan,np.nan],[np.nan,1,2,np.nan]],columns=['x1','x2','x3','x4'])
df.dropna(thresh=1) 
640?wx_fmt=png

在列方向上至少保留有3个非NAN的项保留

df=pd.DataFrame([[1,1,2,np.nan],[3,5,np.nan,np.nan],[13,21,34,np.nan],[55,np.nan,10,np.nan],
                [np.nan,np.nan,np.nan,np.nan],[np.nan,1,2,np.nan]],columns=['x1','x2','x3','x4'])
df.dropna(thresh=3,axis=1)
640?wx_fmt=png

6.2  替补法

对于连续变量,如果变量的分布近似或就是正态分布的话,可以用均值替代那些缺失值; 

fillna函数的参数:

value:用于填充缺失值的标量值或者字典对象  

使用一个常量来填补缺失值,可以使用fillna函数实现简单的填补工作

1.用0填补所有缺失值
df.fillna(0)
640?wx_fmt=png
2.采用前项填充或后项填充,用一个观测值填充
df.fillna(method='ffill')  
640?wx_fmt=png

用后一个观测值填充--这样会导致最后边的无法填充Nan

df.fillna(method='bfill') 
640?wx_fmt=png
3.使用常量填充不同的列
df.fillna({'x1':1,'x2':2,'x3':3})
640?wx_fmt=png
4.使用均值或中位数填充各自的列
x1_median=df['x1'].median()
x2_mean=df['x2'].mean()
x3_mean=df['x3'].mean()
print(x1_median,x2_mean,x3_mean)
8.0 7.0 12.0
df.fillna({'x1':x1_median,'x2':x2_mean,'x3':x3_mean})
640?wx_fmt=png

使用填充法时,相对于常数填充或者前项、后项填充,使用各列众数,均值或中位数填充要更加合理些,这也是工作中常用的一个快捷手段。

7 实现excel的数据透视表功能

pivot_table(data,values=None,index=None,columns=None,aggfunc='mean',

data:需要进行数据透视表操作的数据框

test_data.head()
640?wx_fmt=png

marital作为分组变量,balance作为数值变量做统计汇总

pd.pivot_table(test_data,values=['balance'],columns=['marital'])
640?wx_fmt=png

marital作为1个分组变量,balance,housing作为两个数值变量做统计汇总

pd.pivot_table(test_data,values=['balance','housing'],columns=['marital'])
640?wx_fmt=png

marital,job作为2个分组变量,balance作为1个数值变量做统计汇总

pd.pivot_table(test_data,values=['balance','housing'],columns=['marital','job'])
         marital  job
balance  1        1      1228.493671
                  2      1785.391272
                  3      2353.951501
                  4       845.000000
                  5      1243.956701
                  6       977.805556
                  7      1364.432602
                  8      1243.585938
                  9      1579.081081
                  10     1952.578544
                  11     1270.040984
                  12     1749.975000
         2        1      1355.333333
                  2      1501.268148
                  3      1890.900000
                  4      1205.809322
                  5      1438.189147
                  6       878.873606
                  7      1236.768448
                  8      1047.812500
                  9      1716.306931
                  10     1367.694737
                  11     2158.580000
                  12      814.833333
         3        1      1166.673913
                  2      1801.176471
                  3      1454.990196
                  4      2946.000000
                  5       962.784141
                  6       940.809917
                            ...     
housing  1        7         1.601881
                  8         1.725361
                  9         1.459459
                  10        1.475096
                  11        1.573770
                  12        1.000000
         2        1         1.393939
                  2         1.482963
                  3         1.300000
                  4         1.241525
                  5         1.533333
                  6         1.676580
                  7         1.587786
                  8         1.708333
                  9         1.257426
                  10        1.452632
                  11        1.540000
                  12        1.055556
         3        1         1.239130
                  2         1.533088
                  3         1.235294
                  4         1.000000
                  5         1.550661
                  6         1.628099
                  7         1.657609
                  8         1.705521
                  9         1.513514
                  10        1.457143
                  11        1.571429
                  12        1.500000
Length: 72, dtype: float64

marital,job作为2个分组变量,balance,housing作为两个数值变量做统计汇总

pd.pivot_table(test_data,values=['balance','housing'],columns=['marital','job'])
         marital  job
balance  1        1      1228.493671
                  2      1785.391272
                  3      2353.951501
                  4       845.000000
                  5      1243.956701
                  6       977.805556
                  7      1364.432602
                  8      1243.585938
                  9      1579.081081
                  10     1952.578544
                  11     1270.040984
                  12     1749.975000
         2        1      1355.333333
                  2      1501.268148
                  3      1890.900000
                  4      1205.809322
                  5      1438.189147
                  6       878.873606
                  7      1236.768448
                  8      1047.812500
                  9      1716.306931
                  10     1367.694737
                  11     2158.580000
                  12      814.833333
         3        1      1166.673913
                  2      1801.176471
                  3      1454.990196
                  4      2946.000000
                  5       962.784141
                  6       940.809917
                            ...     
housing  1        7         1.601881
                  8         1.725361
                  9         1.459459
                  10        1.475096
                  11        1.573770
                  12        1.000000
         2        1         1.393939
                  2         1.482963
                  3         1.300000
                  4         1.241525
                  5         1.533333
                  6         1.676580
                  7         1.587786
                  8         1.708333
                  9         1.257426
                  10        1.452632
                  11        1.540000
                  12        1.055556
         3        1         1.239130
                  2         1.533088
                  3         1.235294
                  4         1.000000
                  5         1.550661
                  6         1.628099
                  7         1.657609
                  8         1.705521
                  9         1.513514
                  10        1.457143
                  11        1.571429
                  12        1.500000
Length: 72, dtype: float64

很显然,这样的结果并不想Excel中预期的那样,该如何变成列联表的形式呢?很简单,只需将结果进行非堆叠操作即可。

pd.pivot_table(test_data,values=['balance','housing'],columns=['marital','job']).unstack()
640?wx_fmt=png

这样的结果看起来更舒服一些

使用多个聚合函数

pd.pivot_table(test_data,values=['balance','housing'],columns=['marital'],
               aggfunc=[np.mean,np.median,np.std])
640?wx_fmt=png

8 多层索引的使用

接下再讲一个Pandas中的重要功能,那就是多层索引。 

640?wx_fmt=png

Series的多层索引

s=pd.Series([1,2,3,4],index=[['小张','小张','老王','老王'],
                            ['期中','期末','期中','期末']])
s
小张  期中    1
     期末    2
老王  期中    3
     期末    4
dtype: int64

取回最外层索引为‘小张’的所有数据

s[['小张']] 
小张  期中    1
     期末    2
dtype: int64

取回最内层所有为‘期中’的数据

s[:,'期中']
小张    1
老王    3
dtype: int64
将多层次索引的序列转换为数据框的形式
s.unstack()

期中期末
小张12
老王34

以上是对序列的多层次索引,接下来将对数据框的多层次索引,多层索引的形式类似excel中的如下形式。

640?wx_fmt=png
构造一个类似的高维数据框
df=pd.DataFrame(np.random.randint(10,50,20).reshape(5,4),
               index=[['A','A','A','B','B'],[1,2,3,1,2]],
               columns=[['x','x','x','y'],['x1','x2','x3','y']])
df
640?wx_fmt=png
通过外层索引取出大块数据
df['x']
640?wx_fmt=png

df.loc[['A'],:]
640?wx_fmt=png

在数据框中使用多层索引,可以将整个数据集控制在二维表结构中,这对于数据重塑和基于分组的操作(如数据透视表的生成)比较有帮助。 以test_data二维数据框为例,构造一个多层索引数据集。

pd.pivot_table(test_data,index=['marital','loan'])
640?wx_fmt=png

以上pandas模块的基本学习就完成了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值