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](https://i-blog.csdnimg.cn/blog_migrate/56cab8a80f1cb166a0693d5bceaba40a.png)
添加新列---增加的新列没有赋值,就会出现NAN的形式
pd.DataFrame(student2,columns=['Age','Heught','Name','Sex','weight','Score'])
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/75a9b96539eccb0b8bc79e0e75d52aa7.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](https://i-blog.csdnimg.cn/blog_migrate/1162c31cd02b2117fedf1b28b99361a8.png)
删除指定的列
student3.drop(['Height','weight'],axis=1)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/e10ad58eb4fcbd6fa7541bd4f3b2b741.png)
不论删除行还是列,都可以通过drop方法实现,只需要设定好删除的轴即可,即调整drop方法中的axis参数。默认参数为0,即删除行观测数据,如果需要删除列变量,则需要设置为1.
改:修改原始记录的值
如果发现表中的数据错了,如何更改原来的值呢?尝试结合布尔索引和赋值的方法
student3
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/c73da09b004ff6bf67b56a734a9bc1a8.png)
假设需要修改liu学生的身高为173
student3.loc[student3['Name']=='Liu','Height']=173
student3
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/1aa9bd4bf064b9b4c560b6fb949494a3.png)
查:类似上边的数据查询部分
聚合:groupby()
student3.groupby('Sex').mean()
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/3b91bfc9a53246a006a282938e748284.png)
多个分组变量,例如根据年龄和性别分组,计算身高和体重的平均值
student3.groupby(['Sex','Age']).mean()
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/53a968d4aafebecbf6c612a1ee1a036b.png)
对每个分组计算多个统计量
student3.drop('Age',axis=1).groupby('Sex').agg([np.mean,np.median])
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/91cd91a676d6ddbcf598b173455c291f.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](https://i-blog.csdnimg.cn/blog_migrate/f8c33c099cc8ef5edcd2fa3dcf201e0d.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](https://i-blog.csdnimg.cn/blog_migrate/7486b94b3635fbabed8ddfcddfabd521.png)
student3['Name']=['Alfred','Alice','Barbara','Carol']
student3
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/fb5f6b1bbfb1b80b4d16a3d87c1f3ef6.png)
把学生表和成绩表做一个关联,默认情况下实现的是两个表之间的内连接,即返回两张表中共同部分的数据
stu_score1=pd.merge(student3,score,on='Name')
stu_score1
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/7cc57e5b76adda17c7ab64287a11fc44.png)
stu_score1=pd.merge(student3,score,on='Name',how='inner')
stu_score1
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/d507283b554d6994d60151eda9063963.png)
使用how参数设置连接的方式,left为左连接,right为右连接,outer为外连接
stu_score2=pd.merge(student3,score,on='Name',how='left')
stu_score2
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/e1622e7a9552ea48aeb268a8535ebac1.png)
保留score表中的所有信息,同时将student3表的信息与之配对,能配多少配多少,对于没有配上的score,将会显示Nan
stu_score3=pd.merge(student3,score,on='Name',how='right')
stu_score3
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/bbf9665ce8a8c8e0faa91626701a3b94.png)
stu_score4=pd.merge(student3,score,on='Name',how='outer')
stu_score4
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/c999cf15abc038a28e05e341b3560c55.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](https://i-blog.csdnimg.cn/blog_migrate/d815fba9b515b641d0e63d8ce05de150.png)
df.dropna()
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/3f78e89463a57777b9286afaba2ec8b2.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](https://i-blog.csdnimg.cn/blog_migrate/381eccf0c05d01e487fab0009e168d57.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](https://i-blog.csdnimg.cn/blog_migrate/e970a5ccd9485f9e15766c31e844adf0.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](https://i-blog.csdnimg.cn/blog_migrate/b78bbc558c68fa6aea22ebcdd367b0df.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](https://i-blog.csdnimg.cn/blog_migrate/e27b35bb2f98b332efdb2ad7f4baa08a.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](https://i-blog.csdnimg.cn/blog_migrate/ae84e402329bc8196ed47675c637d160.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](https://i-blog.csdnimg.cn/blog_migrate/5e19f4cf995248dac0cfe36d3324d241.png)
6.2 替补法
对于连续变量,如果变量的分布近似或就是正态分布的话,可以用均值替代那些缺失值;
fillna函数的参数:
value:用于填充缺失值的标量值或者字典对象
使用一个常量来填补缺失值,可以使用fillna函数实现简单的填补工作
1.用0填补所有缺失值
df.fillna(0)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/30ed594c90ef641e1531c8e8cc54c65f.png)
2.采用前项填充或后项填充,用一个观测值填充
df.fillna(method='ffill')
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/f6f6df500b61b97fd592644696880386.png)
用后一个观测值填充--这样会导致最后边的无法填充Nan
df.fillna(method='bfill')
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/9283c6c00ae6ce9e79021830b89c8ef1.png)
3.使用常量填充不同的列
df.fillna({'x1':1,'x2':2,'x3':3})
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/ad0b2dd6d3210cb09cd6729426fe6554.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](https://i-blog.csdnimg.cn/blog_migrate/7145472d62fbd0a3579f6e8aac2a69a4.png)
使用填充法时,相对于常数填充或者前项、后项填充,使用各列众数,均值或中位数填充要更加合理些,这也是工作中常用的一个快捷手段。
7 实现excel的数据透视表功能
pivot_table(data,values=None,index=None,columns=None,aggfunc='mean',
data:需要进行数据透视表操作的数据框
test_data.head()
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/ab643c44070f226a1fda46b39552d448.png)
marital作为分组变量,balance作为数值变量做统计汇总
pd.pivot_table(test_data,values=['balance'],columns=['marital'])
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/ddf5b79beab4248fcd359d5b010ee65d.png)
marital作为1个分组变量,balance,housing作为两个数值变量做统计汇总
pd.pivot_table(test_data,values=['balance','housing'],columns=['marital'])
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/09788efa71594e4a15e2580c56763ace.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](https://i-blog.csdnimg.cn/blog_migrate/01719ab5ac1f3127e415cdb866a846a5.png)
这样的结果看起来更舒服一些
使用多个聚合函数
pd.pivot_table(test_data,values=['balance','housing'],columns=['marital'],
aggfunc=[np.mean,np.median,np.std])
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/78af5b0cc116cc6002360ad297d9360a.png)
8 多层索引的使用
接下再讲一个Pandas中的重要功能,那就是多层索引。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/08725a101093aa27d594e71f121414d8.jpeg)
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()
期中 | 期末 | |
---|---|---|
小张 | 1 | 2 |
老王 | 3 | 4 |
以上是对序列的多层次索引,接下来将对数据框的多层次索引,多层索引的形式类似excel中的如下形式。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/93d8ce911c3d65373288693465b9b60a.jpeg)
构造一个类似的高维数据框
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](https://i-blog.csdnimg.cn/blog_migrate/631c11515aa04fc8b61cf619fe8f9061.png)
通过外层索引取出大块数据
df['x']
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/3564dad63f7e8105fbf590fc028ec8dd.png)
df.loc[['A'],:]
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/b2af9b3a07dd06c771b158ac013637a1.png)
在数据框中使用多层索引,可以将整个数据集控制在二维表结构中,这对于数据重塑和基于分组的操作(如数据透视表的生成)比较有帮助。 以test_data二维数据框为例,构造一个多层索引数据集。
pd.pivot_table(test_data,index=['marital','loan'])
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/75f4f4aef3bb854629d0eee86eeb640a.png)
以上pandas模块的基本学习就完成了。