"""
运算符 pandas 注释 sql
> df.query('column>x') 通过字符串表达式对列进行筛选 where column > x
= df.query('column=x') where column = x
< df.query('column<x') where column < x
between..and.. df[df.column.between(x,y)] 参数:right/left:左右边界的值,如between(x,y) where column between x and y
inclusive:确定是否包括边界值,若包括inclusive = True;
若不包括,inclusive = False。默认为True
in df[df.column.isin([x,y,z...])] 判断指定字段中的值是否包含在所传入的列表当中, where column in (x,y,z...)
并返回一个全为Bool值的Series
not in df[~df.column.isin([x,y,z...])] isnotin() where column not in (x,y,z...)
is null df[df.column.isnull()] 检测指定字段的缺失值,若出现Nan,则映射到True值,
非空则映射到False。并返回与字段形状相同的Bool值的Series where column is null
is not null df[~df.column.isnull()] notna() where column is not null
and df.query('x<column&column<y') python中使用&表示 与 where x<column and column <y
or df.query('x<column|column<y') python中使用|表示 或 where x<column or column <y
not 在df前加一个 ~ python中使用~表示 非 放在配合使用的运算符前
"""
"""
模糊查询 pandas 注释 sql
like df[df.column.str.contains('xxx')] 判断所传入的字符串是否包含在我们指定字段的内容中,
并返回与字段形状相同的Bool值的Series
参数:pat:字符串,如左侧实例
case:是否区分pat中的大小写,若区分,则case = True;
若不区分,则case = False。默认为True,区分。 where column like '%xxx%'
df[df.column.str.startswith('x')] 判断指定字段的内容是否以传入的字符串为开头,
并返回与字段形状相同的Bool值的Series
参数:pat:字符串,如左侧实例 where column like 'x%'
df[df.column.str.endswith('x')] 判断指定字段的内容是否以传入的字符串为结尾,
并返回与字段形状相同的Bool值的Series
参数:pat:字符串,如左侧实例 where column like '%x'
"""
# query只能进行><=的筛选,其他筛选需要使用布尔索引完成
#样例演示# - 1【运算符】and:查找gmvroi>7 且 gmvroi<8 的门店ID跟名字# select 门店ID,平台门店名称# from ddm.cpc# where gmvroi <8.0# and gmvroi >7.0# - 2【运算符】between and:查找门店gmvroi介于[7,8]的门店ID跟名字# select 门店ID,平台门店名称# from ddm.cpc# where gmvroi between 7.0 and 8.0
cpc.query('gmvroi>7.0&gmvroi<8.0')[['门店ID','平台门店名称']]#query:where#&:and
# - 3【运算符】in:查找门店gmvroi等于[7,8]的门店ID跟名字# select 门店ID,平台门店名称# from ddm.cpc# where gmvroi in(7.0,8.0)
cpc[['门店ID','平台门店名称']][cpc.gmvroi.isin([7.0,8.0])]#cpc[['门店ID','平台门店名称']]:select 门店ID,平台门店名称#[]内cpc:from#gmvroi.isin():where gmvroi in()
门店ID
平台门店名称
378
8052557
蛙小辣火锅杯(真如店)
488
2001053699
蛙小辣·美蛙火锅杯(大宁店)
1012
8491999
蛙小辣火锅杯(宝山店)
1064
8491999
蛙小辣火锅杯(宝山店)
# - 4【运算符】null:查找门店实收为空的门店ID跟名字# select 门店ID,平台门店名称# from ddm.cpc# where 门店实收 is null
cpc[['门店ID','平台门店名称']][cpc.门店实收.isnull()]#cpc[['门店ID','平台门店名称']]:select 门店ID,平台门店名称#[]内cpc:from#门店实收.isnull():where 门店实收 is null
门店ID
平台门店名称
306
2001104355
蛙小辣·美蛙火锅杯(宝山店)
332
2000555792
蛙小辣·美蛙火锅杯(虹口足球场店)
805
8491999
蛙小辣火锅杯(宝山店)
806
8491999
蛙小辣火锅杯(宝山店)
807
8491999
蛙小辣火锅杯(宝山店)
808
8491999
蛙小辣火锅杯(宝山店)
809
8491999
蛙小辣火锅杯(宝山店)
810
8491999
蛙小辣火锅杯(宝山店)
1086
2001104355
蛙小辣·美蛙火锅杯麻辣烫(宝山店)
# - 5【模糊查询】like:查找名称带有宝山的门店# select distinct(平台门店名称)# from ddm.cpc# where 平台门店名称 like '%宝山%'
pd.Series(cpc['平台门店名称'][cpc.平台门店名称.str.contains('宝山')].unique())#cpc['平台门店名称']:select 平台门店名称#[]内cpc:from#平台门店名称.str.contains('宝山'):平台门店名称 like '%宝山%'#unique():distinct#pd.Series:将结果转换为Series类型
"""
聚合函数 pandas sql
AGV() df.column.mean() select avg(column) from df
COUNT() df.column.count() select count(column) from df
MAX() df.column.max() select max(column) from df
MIN() df.column.min() select min(column) from df
SUM() df.column.sum() select sum(column) from df
"""
"""
分组筛选 pandas 注释 sql
group df.groupby('column').agg(列名 = ('values','sum'))
df.groupby(['column1','column2']).agg(列名 = ('values','sum')) group by column
groupby('column'):指定我们的分组字段
agg():聚合函数
列名:我们对聚合字段名别名
'value':数值型字段的名字
'sum':聚合函数的名字,也可以是max、min等
having df.groupby('column').agg(列名 = ('values','sum')).query('列名>x') 通过对分组聚合后形成的表格,
进行query条件筛选 having sum(value)>x
"""
# - 1【聚合函数】avg:查找各个门店的平均实收# select 平台门店名称,avg(门店实收) as 平均实收# from ddm.cpc# group by 平台门店名称
cpc.groupby('平台门店名称').agg(平均实收 =('门店实收','mean'))#cpc:from#groupby('平台门店名称'):group by 平台门店名称#agg(平均实收 = ('门店实收','mean')):avg(门店实收) as 平均实收#最终结果会显示所有提到的字段
平均实收
平台门店名称
利芳·一人食大盘鸡(国定路店)
1167.085
利芳大盘鸡(国定路店)
1003.667
拌客·干拌麻辣烫(武宁路店)
1694.323
拌客干拌麻辣烫(武宁路店)
798.885
拌客干拌麻辣烫(武宁路店)
1407.018
蛙小辣·美蛙火锅杯(五角场店)
422.050
蛙小辣·美蛙火锅杯(大宁店)
505.522
蛙小辣·美蛙火锅杯(宝山店)
957.794
蛙小辣·美蛙火锅杯(真如店)
766.085
蛙小辣·美蛙火锅杯(芳华路店)
152.650
蛙小辣·美蛙火锅杯(虹口足球场店)
819.382
蛙小辣·美蛙火锅杯(龙阳路店)
200.935
蛙小辣·美蛙火锅杯麻辣烫(五角场店)
347.616
蛙小辣·美蛙火锅杯麻辣烫(宝山店)
397.069
蛙小辣·美蛙火锅杯麻辣烫(五角场店)
297.900
蛙小辣·美蛙火锅杯(虹口足球场店)
799.586
蛙小辣·美蛙火锅杯(长风大悦城店)
1072.849
蛙小辣火锅杯
1372.333
蛙小辣火锅杯(五角场店)
1310.239
蛙小辣火锅杯(徐汇店)
177.170
蛙小辣火锅杯(龙阳广场店)
467.875
蛙小辣火锅杯麻辣烫(五角场店)
263.390
蛙小辣火锅杯(五角场店)
484.383
蛙小辣火锅杯(合生汇店)
1048.700
蛙小辣火锅杯(宝山店)
383.836
蛙小辣火锅杯(真如店)
521.149
蛙小辣火锅杯(金煌美食城店)
278.333
蛙小辣美蛙火锅杯(五角场店)
1227.000
蛙小辣美蛙火锅杯(真如店)
367.000
蛙小辣美蛙火锅杯(亚龙美食城店)
602.084
蛙小辣美蛙火锅杯(大宁国际店)
621.079
# - 2【分组筛选】having:查找实收>10k的门店名称 与 实收,按实收降序# select 平台门店名称,sum(门店实收)# from ddm.cpc# group by 平台门店名称# having sum(门店实收)>10000# order by sum(门店实收) desc
cpc.groupby('平台门店名称').agg(总合 =('门店实收','sum')).query('总合>10000').sort_values(by ='总合',ascending=False)#cpc:from#groupby('平台门店名称'):group by 平台门店名称#agg(总合 = ('门店实收','sum')):sum(门店实收)#query('总合>10000'):having sum(门店实收)>10000#sort_values(by = '总合',ascending=False):order by sum(门店实收) desc
总合
平台门店名称
拌客·干拌麻辣烫(武宁路店)
140628.830
蛙小辣·美蛙火锅杯(宝山店)
101526.140
蛙小辣火锅杯(五角场店)
99578.180
蛙小辣·美蛙火锅杯(虹口足球场店)
71286.210
蛙小辣火锅杯(宝山店)
71009.660
蛙小辣·美蛙火锅杯麻辣烫(宝山店)
64722.170
利芳·一人食大盘鸡(国定路店)
51351.750
蛙小辣·美蛙火锅杯(真如店)
44432.920
蛙小辣·美蛙火锅杯(虹口足球场店)
43977.250
拌客干拌麻辣烫(武宁路店)
36582.480
蛙小辣火锅杯(合生汇店)
35655.800
蛙小辣·美蛙火锅杯(长风大悦城店)
33258.330
利芳大盘鸡(国定路店)
24088.000
蛙小辣美蛙火锅杯(亚龙美食城店)
17460.440
蛙小辣火锅杯(真如店)
17197.930
蛙小辣美蛙火锅杯(大宁国际店)
12421.580
"""
排序 pandas 注释 sql
正序 df.sort_values(by = 'column',ascending = True) 参数:by:选择排序依据的字段。若需要依据多列, order by column asc
则:['x1','x2']。
ascending:选择排序方式。若正序,则:ascending=True;
若倒序,则:ascending=True
倒序 df.sort_values(by = 'column',ascending = False) order by column desc
"""
# - 1【排序】order by:查看每个“武宁路”门店的实收,按实收降序# select 平台门店名称,sum(门店实收)# from ddm.cpc# where 平台门店名称 like '%武宁路%'# group by 平台门店名称# order by sum(门店实收) desc
x = cpc[cpc.平台门店名称.str.contains('武宁路')]
x.groupby(cpc.平台门店名称).agg(实收 =('门店实收','sum')).sort_values(by='实收',ascending =False)#代码较长,采用两段的形式讲解#cpc.平台门店名称.str.contains('武宁路'):where 平台门店名称 like '%武宁路%'#groupby(cpc.平台门店名称):group by 平台门店名称#sort_values(by='实收',ascending = False):order by sum(门店实收) desc#agg(实收 = ('门店实收','sum')):sum(门店实收)
实收
平台门店名称
拌客·干拌麻辣烫(武宁路店)
140628.830
拌客干拌麻辣烫(武宁路店)
36582.480
拌客干拌麻辣烫(武宁路店)
1597.770
"""
限制 pandas 注释 sql
limit x df.head(x) 取前x行 limit x
limit x,y df[x:y] / df.loc[x:y,'字段'] 跳过前x行,取y行 limit x,y
limit x offsets y df[x:y] 跳过前x行,取y行 limit x offsets y
"""
# - 习题2【LIMIT】查找门店平均实收>1K的门店名称与平均实收,显示前10条数据,结构按照平均实收降序# select 平台门店名称,avg(门店实收) as 平均实收# from ddm.cpc# group by 平台门店名称# having 平均实收 > 1000# order by 平均实收 desc# limit 5
cpc.groupby('平台门店名称').agg(平均实收 =('门店实收','mean')).query('平均实收>1000').sort_values(by ='平均实收',ascending=False).head(5)#cpc:from ddm.cpc#groupby('平台门店名称'):group by 平台门店名称#order by 平均实收 desc:query('平均实收>1000')#sort_values(by = '平均实收',ascending=False):order by 平均实收 desc#head(5):limit 5#agg(平均实收 = ('门店实收','mean')):avg(门店实收) as 平均实收
平均实收
平台门店名称
拌客·干拌麻辣烫(武宁路店)
1694.323
拌客干拌麻辣烫(武宁路店)
1407.018
蛙小辣火锅杯
1372.333
蛙小辣火锅杯(五角场店)
1310.239
蛙小辣美蛙火锅杯(五角场店)
1227.000
###子查询"""
#先做出子查询的筛选条件
a = df1.query("value1==x")['value1']
#再将我们的条件放入isin()方法中
b = df2['column'][df2['value2'].isin(a)]
select column from df2 where value2 in (select value1 from df1 where value1 = x)
"""
# - 1:查找实收(cpc.csv)>1K的门店名称# select distinct 平台门店名称# from ddm.cpc# where 门店ID# in# (# select 门店ID# from ddm.cpc# where 门店实收>1000# )
a = cpc.query('门店实收>1000').门店ID #子查询条件a:门店实收>1k的门店ID
b = cpc['平台门店名称'][cpc['门店ID'].isin(a)].unique()#将条件放入isin()当中
pd.Series(b)
# 左连接
df3=pd.merge(df1,df2,left_on='column1',right_on='column2',how ='left')
select *from df
left join df2
on df1.column1 = df2.column2
df3=pd.merge(df1,df2,left_on=['df1_column1,df1_column2'],right_on=['df2_column1','df2_column2'],how ='left')
shop = pd.read_csv('./shop.csv',encoding='gbk')# - 1【内连接】:查看门店名称(shop)的实收(cpc)(连接字段:门店ID)# select s.门店名称# ,sum(c.门店实收)# from ddm.cpc c# join ddm.shop s# on c.门店ID = s.门店ID# group by s.门店名称
M = pd.merge(cpc,shop,left_on ='门店ID',right_on ='门店ID',how ='inner')
M.groupby(['门店名称']).agg(门店实收 =('门店实收','sum'))#代码较长,分为两段#pd.merge:join#cpc,shop:from cpc join shop#left_on:左表cpc连接字段#right_on:右表shop连接字段#how = 'inner':(inner) join#groupby(['门店名称']):group by s.门店名称
门店实收
门店名称
五角场店
156247.320
宝山店
13973991.240
怒江路店
133033.320
拌客干拌麻辣烫(武宁路店)
10907353.880
# - 2 继续题1,采用2个连接字段:门店ID与日期# select s.门店名称# ,sum(c.门店实收)# from ddm.cpc c# join ddm.shop s# on c.门店ID = s.门店ID# and c.日期 = s.日期# group by s.门店名称
M = pd.merge(cpc,shop,left_on =['门店ID','日期'],right_on =['门店ID','日期'],how ='inner')
M.groupby(['门店名称']).agg(门店实收 =('门店实收','sum'))
门店实收
门店名称
宝山店
43150.250
拌客干拌麻辣烫(武宁路店)
129332.680
# 窗口函数1,分组聚合
df['sum_value']= df.groupby('column')['value'].transform('sum')#goupby:partition by#transform:能够输出与DataFrame行数相同的聚合;
select column,value,sum(value) over(partition by column)as sum_value
2,分组排名
df['dense_rank']= df.groupby('column')['value'].rank(ascending =False,method ='dense')#method = 'min':rank()#method = 'dense':dense_rank()#method = 'first':row_number()#rank:1,2,2,4#dense_rank:1,2,2,3
select column,value,
dense_rank(value) over(partition by column order by value desc)as dense_rank
# - 1:每一天/不同门店的/门店实收排名,采用日期、门店实收正序输出# select 日期# ,平台门店名称# ,门店实收# ,rank() over (partition by 日期 order by 门店实收 desc) as rankk# from ddm.cpc# order by 日期,门店实收 desc
cpc['rank']= cpc.groupby('日期')['门店实收'].rank(method ='min',ascending=False)#这里相当于rank() over (partition by 日期 order by 门店实收 desc) as rankk
cpc.sort_values(by =['日期','门店实收'],ascending=[True,False])[['日期','平台门店名称','门店实收','rank']]#sort_values(by = ['日期','门店实收'],ascending=[True,False]):order by 日期,门店实收 desc#[['日期','平台门店名称','门店实收','rank']]:select 日期,平台门店名称,门店实收,rankk
cpc['rank']= cpc.groupby(['日期','平台i'])['门店实收'].rank(method ='min',ascending=False)
cpc