Вы можете использовать groupby
в сочетании с .agg
и передать ему функции mean
и std
:
print(df.groupby(['colour', 'item']).agg({'price':['mean', 'std']}).reset_index())
colour item price
mean std
0 blue cup 2.300 NaN
1 blue jug 2.400 NaN
2 red cup 1.625 0.176777
Посмотрите что EXPLAIN EXTENDED
говорит.
Если это говорит DEPENDENT SUBQUERY
или UNCACHEABLE SUBQUERY
, затем это будет переоценено каждый раз, когда это используется.
Это происходит, если подзапрос использует переменные сеанса или является связанным подзапросом.
Если это не сделает, то это по всей вероятности будет кэшироваться.
Если Ваш случай, подзапрос не будет кэшироваться, он будет переоценен в каждом UNION
'редактор установил.
Вы подзапрашиваете, тем не менее, кажется, является слишком сложным. Почему не делают Вас, просто используйте:
SELECT id
FROM playlist_program_map ppm, programs p
WHERE ppm.playlist_id = 181
AND p.id = ppm.program_id
AND submitter_id = 32
AND feed_id = 2478
Если у Вас есть индекс на playlist_program_map (playlist_id)
, этот запрос должен работать как очарование.
Могли Вы говорить мне еще две вещи:
playlist_program_map
и сколько DISTINCT playlist_id
значения там? programs
и сколько DISTINCT submitter_id, feed_id
пары там?Из Вашего комментария я могу прийти к заключению, что существует 10 programs
на playlist
в среднем, и 200 programs
на (submitter, feed)
пара. Это означает Ваш индекс на playlist_program_map
является более выборочным, чем тот на (submitter, feed)
, и playlist_program_map
должно быть ведущим в соединении.
Полнотекстовый индекс в Вашем случае также, кажется, не является очень выборочным, учитывая, что необходимо присоединиться к 10 программам из 2,000,000.
Можно лучше попробовать следующее:
SELECT object_id, programs.created AS created
FROM playlist_program_map ppm, programs p, comments_programs cp
WHERE ppm.playlist_id = 181
AND p.id = ppm.program_id
AND p.submitter_id = 32
AND p.feed_id = 2478
AND cp.object_id = p.id
AND cp.text REGEXP 'excellent'
, и повторите это для всех трех таблиц.