当下python在数据处理以及量化分析数据挖掘上使用越发广泛,本文将针对python中pandas包下的DataFrame这种数据类型的的使用进行详细说明,以及其在数据处理的同等情况下SQL中的对比,话不多说,开整!!!
https://blog.youkuaiyun.com/weixin_39818658/article/details/79944925
关键字:pandas、DataFrame、SQL
1、关于数据表列的筛选
有DataFrame(也就是二维数据表)data:
使用
data=DataFrame(np.arange(9).reshape(3,3),columns=[‘a’,‘b’,‘c’])
语句即可生成该DataFrame
data :
a b c
0 0 1 2
1 3 4 5
2 6 7 8
如果我们只取data的a列 直接使用一个切片操作(注:对列进行选取切片操作是两层中括号):
data[[‘a’]]
--------->
0 0
1 3
2 6
对应的SQL语句为:
select a from data
如果我们要取a和b两个字段同样是切片操作:
data[[‘a’,‘b’]]
------>
a b
0 0 1
1 3 4
2 6 7
对应的SQL语句为:
select a,b from data
首先我们在此先创建两个DataFrame:
公司基本信息数据表
companydata=DataFrame({'ID':['aa','bb','cc'],
'name':['公司A','公司B','公司C'],
'establish_year':['2001','2002','2003'],
'city':['ShangHai','BeiJing','ShenZhen']})
----->
ID city establish_year name
0 aa ShangHai 2001 公司A
1 bb BeiJing 2002 公司B
2 cc ShenZhen 2003 公司C
公司发行产品表:
productdata=DataFrame({'ID':['aa','aa','bb','bb','cc'],
'productname':['stock_A','bond_A','stock_B','bond_B','stock_C']
})
--------->
ID productname
0 aa stock_A
1 aa bond_A
2 bb stock_B
3 bb bond_B
4 cc stock_C
2、数据的索引、选取、过滤
(1)单条件筛选
首先先选取’公司A’的所有信息,操作如下:
companydata[companydata[‘name’]==‘公司A’]
---------------------------------------------------------------------------->
ID city establish_year name
0 aa ShangHai 2001 公司A
相当于SQL:
select * from companydata where name=’公司A’
(2)多条件筛选 (注:多条件筛选条件需要写进括号内)
选取’公司B’并且’city’为’BeiJing’,操作如下:
companydata[(companydata[‘name’]‘公司B’)&(companydata[‘city’]‘BeiJing’)]
-------->
ID city establish_year name
1 bb BeiJing 2002 公司B
相当于SQL:
select * from companydata where name=’公司A’ and city=’BeiJing’
选取’ID’为’aa’或者’cc’的所有信息,操作如下:
companydata[(companydata[‘ID’]‘aa’)|(companydata[‘ID’]‘cc’)]
------>
ID city establish_year name
0 aa ShangHai 2001 公司A
2 cc ShenZhen 2003 公司C
相当于SQL:
select * from companydata where ID=’aa’ or ID=’cc’
或者
companydata[companydata[‘ID’].isin([‘aa’,‘cc’])]
------->
ID city establish_year name
0 aa ShangHai 2001 公司A
2 cc ShenZhen 2003 公司C
相当于SQL:
select * from companydata where ID in (‘aa’,’cc’)
(3)有时候我们筛选之后并不需要所有的字段而只是其中一个或几个字段,
例如:
查看公司A并且’ID’为’aa’的’成立年份’和’所在城市’
我们需要运用到DataFrame的一个索引方法ix,操作如下:
companydata.ix[(companydata[‘name’]‘公司A’)&(companydata[‘ID’]‘aa’),[‘city’,‘establish_year’]]
---------->
city establish_year
0 ShangHai 2001
相当于SQL:
select city,establish_year from companydata where ID=’aa’ and name=’公司A’
3、根据数据的不同情况进行打标签,也就是SQL中的 case when … then … 操作
例如:当公司所在城市’city’ ,’ShangHai’ 时为’SH’,’BeiJing’ 时为’BJ’,’ShenZhen’时为’SZ’,操作如下:
fuc=lambda x:'SH' if x=='ShangHai' else 'BJ' if x=='BeiJing' else 'SZ' if x=='ShenZhen' else np.NaN
companydata['citylabel']=companydata['city'].apply(fuc)
print(companydata)
(关于这个我个人只想到这么一种写法,如有高明的方法,请不吝赐教)
------->
ID city establish_year name citylabel
0 aa ShangHai 2001 公司A SH
1 bb BeiJing 2002 公司B BJ
2 cc ShenZhen 2003 公司C SZ
相当于SQL:
select
ID,
city,
establish_year,
name,
case ‘city’ when ‘'ShangHai' ’ then ‘SH’
when 'BeiJing' then ‘BJ’
when ‘'ShenZhen' ’ then ‘SZ’ else null
end as citylabel
from companydata
4、数据的聚合操作
例:
表productdata对ID进行分组,并计算各个ID有几个金融产品
productdata[productname].groupby(productdata[‘ID’]).count()
------>
ID
aa 2
bb 2
cc 1
Name: ID, dtype: int64
相当于SQL:
select count(productname) from productdata group by ID
productdata[productname].groupby([productdata[‘ID’],productdata[‘productname’]]).count()
----------->
ID productname
aa bond_A 1
stock_A 1
bb bond_B 1
stock_B 1
cc stock_C 1
Name: ID, dtype: int64
相当于SQL:
select count(productname) from productdata group by ID,‘productname’
5、多表关联操作
通常情况下我们处理数据都不是单表操作,一般都是多张表进行关联操作的。
例:
统计一下各个公司都有哪些金融产品,操作如下:
pd.merge(companydata,productdata,left_on=‘ID’,right_on=‘ID’,how=‘left’)[[‘ID’,‘name’,‘productname’]]
------>
ID name productname
0 aa 公司A stock_A
1 aa 公司A bond_A
2 bb 公司B stock_B
3 bb 公司B bond_B
4 cc 公司C stock_C
相当于SQL:
Select A.ID,A.name,B.productname from companydata A left join productdata on A.ID=B.ID
这里简单的说明一下方法merge的参数
(1)首先必须要传入的两个参数就是两个DataFrame ,这里不详细说明
(2)left_on是左表作为关联的外键
(3)right_on是右表作为关联的外键
(4)how是关联的方式,分别有left\right\inner\outer,分别对应着SQL中的left\right\inner\full 四种join方式