Большинство решений выше работают только для одного поля таблицы, вам может понадобиться получить средний (50-й процентиль) для многих полей в запросе.
Я использую это:
SELECT CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(
GROUP_CONCAT(field_name ORDER BY field_name SEPARATOR ','),
',', 50/100 * COUNT(*) + 1), ',', -1) AS DECIMAL) AS `Median`
FROM table_name;
Вы можете заменить «50» в примере выше на любой процентиль, очень эффективно.
Просто убедитесь, что вы у вас достаточно памяти для GROUP_CONCAT, вы можете изменить ее с помощью:
SET group_concat_max_len = 10485760; #10MB max length
Сначала соедините столбцы вместе, затем DataFrame.set_index
с параметром append=True
и измените форму на Series.unstack
:
s = df['port1'].astype(str) + df['port2'].astype(str)
df = df.set_index(s, append=True)['w_ret'].unstack()
print (df)
0.00.0 0.01.0 1.00.0 1.01.0
date
2006-01-01 0.067991 0.033219 0.073324 0.039730
2006-01-02 0.033616 0.022452 -0.024854 0.020411