像写SQL一样学习pandas 中 DataFrame

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_39818658/article/details/79944925

当下python在数据处理以及量化分析数据挖掘上使用越发广泛,本文将针对pythonpandas包下的DataFrame这种数据类型的的使用进行详细说明,以及其在数据处理的同等情况下SQL中的对比,话不多说,开整!!!

 

关键字:pandasDataFrameSQL

 

 

 

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

 

如果我们只取dataa列 直接使用一个切片操作(注:对列进行选取切片操作是两层中括号):

data[['a']]
--------->

0    0

1    3

2    6

 

 

对应的SQL语句为:

select a from data

 

如果我们要取ab两个字段同样是切片操作:


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、数据的聚合操作

例:

productdataID进行分组,并计算各个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方式


个人目前只能想到这么多关于DataFrame的使用及其与SQL的共性,后续遇到新的情况会继续补充。


阅读更多 登录后自动展开
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页