使用Python上的where查询分组

使用Python上的where查询分组,python,sql,pandas,group-by,Python,Sql,Pandas,Group By,我的数据集由分类列和数字列组成。 例如:工资数据集 列:[‘工作’、‘原籍国’、‘年龄’、‘薪水’、‘学位’、‘婚姻状况’] 四个分类列和两个数字列,我想使用三个聚合函数: cat_col = ['job', 'country_origin','degree','marital_status'] num_col = [ 'age', 'salary'] aggregate_function = ['avg','max','sum'] 目前,我有使用原始查询的Python代码,而我的目标是从上面

我的数据集由分类列和数字列组成。 例如:工资数据集

列:
[‘工作’、‘原籍国’、‘年龄’、‘薪水’、‘学位’、‘婚姻状况’]

四个分类列和两个数字列,我想使用三个聚合函数:

cat_col = ['job', 'country_origin','degree','marital_status']
num_col = [ 'age', 'salary']
aggregate_function = ['avg','max','sum']
目前,我有使用原始查询的Python代码,而我的目标是从上面列表的所有组合中获得group by查询结果:

我的查询:
“选择cat\u col[0],从数据库中选择聚合函数[0](num\u col[0]),其中婚姻状况=‘已婚’组按cat\u col[0]”

因此,问题是:

q1 = select job, avg(age) from DB where marietal_status='married' groub by job
q2 = select job, avg(salary) from DB where marietal_status='married' groub by job

etc
我使用
for loop
从所有组合中获得结果

我的问题是,我想将该查询更改为Pandas查询。我已经花了几个小时,但解决不了它

熊猫有不同的查询数据的方法

示例数据帧:

df2 = pd.DataFrame(np.array([['programmer', 'US', 28,4000, 'master','unmarried'], 
                             ['data scientist', 'UK', 30,5000, 'PhD','unmarried'],
                             ['manager', 'US', 48,9000, 'master','married']]),
                   columns=[['job', 'country_origin', 'age', 'salary', 'degree','marital_status']])

创建数据帧(df)后,以下命令将构建所需的表

df.groupby(['job', 'country_origin','degree'])[['age', 'salary']].agg([np.mean,max,sum])
下面是一个完整的示例:

import numpy as np
import pandas as pd
df=pd.DataFrame()
df['job']=['tech','coder','admin','admin','admin','tech']
df['country_origin']=['japan','japan','US','US','India','India']
df['degree']=['cert','bs','bs','ms','bs','cert']
df['age']=[22,23,30,35,40,28]
df['salary']=[30,50,60,90,65,40]
df.groupby(['job', 'country_origin','degree'])[['age', 'salary']].agg([np.mean,max,sum])

首先导入库

import pandas as pd
构建示例数据框架

df = pd.DataFrame( { 
    "job" : ["programmer","data scientist","manager"] , 
    "country_origin" : ["US","UK","US"],
    "age": [28,30,48],
    "salary": [4000,5000,9000],
    "degree": ["master","PhD","master"],
    "marital_status": ["unmarried","unmarried","married"]} )
应用where子句,另存为新的数据帧(不是必需的,但更易于阅读),您当然可以在groupby中使用过滤后的df

married=df[df['marital_status']=='married']
q1=从数据库中选择工作,平均年龄,其中marietal_status='已婚'按工作分组

married.groupby('job').agg( {"age":"mean"} )
or
df[df['marital_status']=='married'].groupby('job').agg( {"age":"mean"} )

         age
job
manager   48
married.groupby('job').agg( {"salary":"mean"} )

         salary
job
manager    9000
q2=从DB中选择工作,平均工资,其中marietal_status='已婚'按工作分组

married.groupby('job').agg( {"age":"mean"} )
or
df[df['marital_status']=='married'].groupby('job').agg( {"age":"mean"} )

         age
job
manager   48
married.groupby('job').agg( {"salary":"mean"} )

         salary
job
manager    9000
可以通过重置索引来展平表格

df[df['marital_status']=='married'].groupby('job').agg( {"age":"mean"} ).reset_index()

       job  age
0  manager   48
同时输出两个统计信息:

df[df['marital_status']=='married'].groupby('job').agg( {"age":"mean","salary":"mean"} ).reset_index()

       job  age  salary
0  manager   48    9000

你能包括一个数据帧的样本吗?@DanielMesejo我只放了一个数据帧的样本。真正的数据在我的Postgre数据库中。虽然使用原始查询对我来说很好,但我需要使用Pandas对其进行更改,以使操作更简单。谢谢