Сгруппировать с где запрос на Pandas Python - PullRequest
1 голос
/ 01 октября 2019

У меня есть набор данных, состоящий из категориальных и числовых столбцов. Например: набор данных зарплаты

столбцы: ['job', 'country_origin', 'age', 'salary', 'degree','marital_status']

четыре категориальных столбца и два числовых столбца, и я хочу использовать три агрегатные функции:

cat_col = ['job', 'country_origin','degree','marital_status']
num_col = [ 'age', 'salary']
aggregate_function = ['avg','max','sum']

В настоящее время яу меня есть код Python, использующий необработанный запрос, в то время как моя цель - получить результаты группового запроса из всех комбинаций из списков, перечисленных выше:

мой запрос: "SELECT cat_col[0], aggregate_function[0](num_col[0]) from DB where marital_status = 'married' groub by cat_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. Я провел пару часов, но не смог решить.

У 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']])

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Сначала импортируйте библиотеки

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, сохраните как новый кадр данных (не обязательно, но проще для чтения), выконечно, можно использовать отфильтрованный df внутри группы

married=df[df['marital_status']=='married']

q1 = выбрать работу, avg (возраст) из БД, где marietal_status = группа «в браке» по работе

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

         age
job
manager   48

q2 =выберите задание, avg (зарплата) из БД, где marietal_status = «женатая» группа по заданию

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
0 голосов
/ 01 октября 2019

После создания вашего фрейма данных (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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...