pandas与SQL对照1_nanyangjx

当下python在数据处理以及量化分析数据挖掘上使用越发广泛,本文将针对python中pandas包下的DataFrame这种数据类型的的使用进行详细说明,以及其在数据处理的同等情况下SQL中的对比,话不多说,开整!!!
https://blog.csdn.net/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方式

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值