Как напечатать данные, используя условие в Python на основе данных результата MySQL - PullRequest
0 голосов
/ 17 мая 2018

У меня есть пример данных MySQL, как показано ниже в таблице

main_cat| sub_cat | number | org_id
Career  | school  | 5      | A
Career  | college | 3      | A
Career  | higher  | 4      | A 
Job     | Blr     | 6      | A
Job     | Hyd     | 11     | A
Job     | Chennai | 12     | A 
Career  | school  | 15     | B
Career  | college | 30     | B
Career  | higher  | 5      | B 
Job     | Blr     | 5      | B
Career  | college | 8      | C
Job     | Chennai | 4      | C 

Я хочу напечатать 2 main_cat для каждой организации.Для каждой верхней 2 main_cat я хочу напечатать верхнюю 2 sub_cat для каждой организации.Таким образом, каждая организация должна иметь 4 или менее записей с верхними 2 main_cat и верхними 2 sub_cat для каждого main_cat

Пожалуйста, помогите мне.

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Для группировки Python предоставляет itertools.groupby(), который группирует отсортированный ввод по заданной ключевой функции.

В этом случае ввод должен быть сначала отсортирован поorg_id, затем main_cat, затем number в порядке убывания, например, если ваши данные в виде списка выглядят так:

data = [
 ['Career', 'school', 5, 'A'],
 ['Career', 'college', 3, 'A'],
 ['Career', 'higher', 4, 'A'],
 ['Job', 'Blr', 6, 'A'],
 ['Job', 'Hyd', 11, 'A'],
 ['Job', 'Chennai', 12, 'A'],
 ['Career', 'school', 15, 'B'],
 ['Career', 'college', 30, 'B'],
 ['Career', 'higher', 5, 'B'],
 ['Job', 'Blr', 5, 'B'],
 ['Career', 'college', 8, 'C'],
 ['Job', 'Chennai', 4, 'C']
]

, вы бы отсортировали их так:

data.sort(key = lambda x: (x[3], x[0], -x[2]))

или, изменив свой оператор SQL на ORDER BY main_cat, sub_cat, number DESC, вы получите его в правильном порядке из базы данных.

Теперь вы можете использовать groupby для группировки иislice для ограничения количества результатов по сгруппированной категории:

from itertools import groupby, islice
from operator import itemgetter

# already sorted data
data = [
 ['Career', 'school', 5, 'A'],
 ['Career', 'higher', 4, 'A'],
 ['Career', 'college', 3, 'A'],
 ['Job', 'Chennai', 12, 'A'],
 ['Job', 'Hyd', 11, 'A'],
 ['Job', 'Blr', 6, 'A'],
 ['Career', 'college', 30, 'B'],
 ['Career', 'school', 15, 'B'],
 ['Career', 'higher', 5, 'B'],
 ['Job', 'Blr', 5, 'B'],
 ['Career', 'college', 8, 'C'],
 ['Job', 'Chennai', 4, 'C']
]

data.sort(key = lambda x: (x[3], x[0], -x[2]))

for org, by_org in groupby(data, key=itemgetter(3)):
    print("org:", org)
    for cat, by_cat in islice(groupby(by_org, key=itemgetter(0)), 2):
        print("  cat:", cat)
        for subcat, by_subcat in islice(groupby(by_cat, key=itemgetter(1)), 2):
            print("    subcat:", subcat, " = ", list(by_subcat))

Вывод:

org: A
  cat: Career
    subcat: school  =  [['Career', 'school', 5, 'A']]
    subcat: higher  =  [['Career', 'higher', 4, 'A']]
  cat: Job
    subcat: Chennai  =  [['Job', 'Chennai', 12, 'A']]
    subcat: Hyd  =  [['Job', 'Hyd', 11, 'A']]
org: B
  cat: Career
    subcat: college  =  [['Career', 'college', 30, 'B']]
    subcat: school  =  [['Career', 'school', 15, 'B']]
  cat: Job
    subcat: Blr  =  [['Job', 'Blr', 5, 'B']]
org: C
  cat: Career
    subcat: college  =  [['Career', 'college', 8, 'C']]
  cat: Job
    subcat: Chennai  =  [['Job', 'Chennai', 4, 'C']]
0 голосов
/ 17 мая 2018

Вы можете использовать pandas для обработки вашего запроса в фрейме данных с помощью read_sql :

import pandas as pd
df = pd.read_sql(connection,query)
result = df.groupby(['org_id', 'main_cat', 'sub_cat'])['number'].head(2)

Переменная connection - это ваше соединение с БД, а query - ваша SELECT строка.

...