Группировка по фрейму данных Pandas и возврат столбца

#sql #pandas #sqlite

#sql #pandas #sqlite

Вопрос:

У меня есть следующий фрейм данных pandas:

введите описание изображения здесь

Я хочу повторить следующий SQL-запрос:

 SELECT
cars, 
city, 
CASE WHEN miles_travelled=100 THEN SUM(complaints)/SUM(calls) ELSE 0 END as ratio
FROM table
GROUP BY cars, city
 

Вот самое близкое, что я был:

 table.groupby(['cars','city','miles_travelled'])['complaints','calls'].sum()
 

Кто-нибудь может помочь.

Комментарии:

1. С точки зрения SQL, это недопустимый запрос агрегации для начала. miles_travelled находится в select предложении, но не в group by предложении.

2. miles_travelled отсутствует в предложении select . Это в операторе case, который агрегируется

3. Я не знаком с CASE методом SQL, поэтому вы хотите miles_travelled быть другим индексом в сгруппированном фрейме данных (иметь значения отношения для каждой комбинации cars, city и miles_traveled) или вам просто нужно значение отношения для каждой комбинации только cars и city, но агрегированное значение ratio не включаетжалобы / вызовы, где miles_travelled = 100? В любом случае, возможно, вам лучше добавить столбец ratio, а затем выполнить групповую агрегацию.

Ответ №1:

Если вы хотите использовать ratio только комбинации city и cars и игнорировать случаи как частное от суммы complaints и calls игнорировать строки, где miles_travelled равно 100, тогда это сработает.

 # filter to ignore rows where miles_travelled = 100
(table[table['miles_travelled'] != 100]
 # groupby city and cars and select the complaint and calls columns
 .groupby(['city','cars'])['complaints','calls']
 # sum the selected columns
 .agg(sum)
 # make the ratio column which is the sum of complaints / sum of calls
 .assign(ratio = lambda x: x['complaints'] / x['calls']))