2017-01-03 2 views
0

У меня есть следующий код и вы хотите создать новый столбец для каждого номера транзакции и описания, который представляет 99-й процентиль каждой строки.Pandon Pandas Расчет Percentile для строки

Я действительно изо всех сил стараюсь добиться этого - кажется, что большинство сообщений покрывают вычисление процентиля на столбце.

Есть ли способ достичь этого? Я ожидаю, что новый столбец будет создан с двумя строками.

df_baseScenario = pd.DataFrame({'Transaction Number' : [1,10], 
          'Description'  :['asf','def'], 
          'Calc_PV_CF_2479.0':[4418494.085,-3706270.679], 
          'Calc_PV_CF_2480.0':[4415476.321,-3688327.494], 
          'Calc_PV_CF_2481.0':[4421698.198,-3712887.034], 
          'Calc_PV_CF_2482.0':[4420541.944,-3706402.147], 
          'Calc_PV_CF_2483.0':[4396063.863,-3717554.946], 
          'Calc_PV_CF_2484.0':[4397897.082,-3695272.043], 
          'Calc_PV_CF_2485.0':[4394773.762,-3724893.702], 
          'Calc_PV_CF_2486.0':[4384868.476,-3741759.048], 
          'Calc_PV_CF_2487.0':[4379614.337,-3717010.873], 
          'Calc_PV_CF_2488.0':[4389307.584,-3754514.639], 
          'Calc_PV_CF_2489.0':[4400699.929,-3741759.048], 
          'Calc_PV_CF_2490.0':[4379651.262,-3714723.435]})  
+1

Все, что вы предоставили, было «DataFrame», а не любая попытка рассчитать этот процентиль самостоятельно ... Также было бы полезно, если бы вы показали образец желаемого результата. – blacksite

+0

Извинения, я новичок в этом и боролся с логикой. Я понимаю, что будущие должности. – Travis

ответ

1

должно работать:

df['99th_percentile'] = df[cols].apply(lambda x: numpy.percentile(x, 99), axis=1)

Я, очевидно, предполагая при этом, что переменная «смещ_по_столбцам» содержит список столбцов, которые вы хотите включить в процентили (Вы можете» t используйте описание в вашем расчете, например).

Что делает этот код, это петли над строками в фрейме данных, и для каждой строки вычисляет numpy.percentile, чтобы получить 99-й процентиль. Вам нужно будет импортировать numpy.

Если вам нужна максимальная скорость, то вы можете использовать numpy.vectorize, чтобы удалить все петли за счет читаемости (непроверенных):

perc99 = np.vectorize(lambda x: numpy.percentile(x, 99)) 
df['99th_percentile'] = perc99(df[cols].values) 
+0

Это отличное спасибо. Я изначально ожидал, что цикл будет медленным, и подумал, что, возможно, перенос вектора/матрицы будет лучшим подходом. У вас есть мнение по этому поводу? – Travis

+0

@Travis Цикл может ввести некоторую задержку, но это не более нескольких секунд для миллиона строк. Ниже приведен более быстрый метод: 'df ['99th_percentile'] = [numpy.percentile (x, 99) для x в df [cols] .values]' , который почти не имеет накладных расходов, но немного более уродливый , Проверьте мое разрешение ответа на самую быструю ценность, о которой я могу думать. – mxbi

0

Слегка редактировался @mxbi.

import numpy as np 
df = df_baseScenario.drop(['Transaction Number','Description'], axis=1) 
df_baseScenario['99th_percentile'] = df.apply(lambda x: np.percentile(x, 99), axis=1) 
Смежные вопросы