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