2017-01-03 3 views
0

Ich habe den folgenden Code und möchte eine neue Spalte pro Transaktionsnummer und Beschreibung erstellen, die das 99. Perzentil jeder Zeile darstellt.Python Pandas Perzentil pro Zeile berechnen

Ich habe wirklich Mühe, dies zu erreichen - es scheint, dass die meisten Beiträge die Berechnung des Perzentils auf der Spalte abdecken.

Gibt es einen Weg, dies zu erreichen? Ich würde erwarten, dass eine neue Spalte mit zwei Zeilen erstellt wird.

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

Alles, was Sie zur Verfügung stellten, war der 'DataFrame', kein Versuch, dieses Perzentil selbst zu berechnen ... Es wäre auch hilfreich, wenn Sie ein Beispiel Ihrer gewünschten Ausgabe zeigen würden. – blacksite

+0

Entschuldigung, ich bin neu und kämpfte mit der Logik. Ich verstehe für zukünftige Beiträge. – Travis

Antwort

1

Folgendes sollte funktionieren:

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

Ich bin hier, dass die Variable ‚cols‘ enthält eine Liste der Spalten, die Sie in der Perzentile (Sie offensichtlich ‚enthalten sein sollen unter der Annahme kann (Verwenden Sie zum Beispiel die Beschreibung in Ihrer Berechnung).

Was dieser Code macht, ist Schleifen über Zeilen im Datenrahmen, und für jede Zeile, berechnet die numpy.percentile, um das 99. Perzentil zu erhalten. Sie müssen numpy importieren.

Wenn Sie maximale Geschwindigkeit benötigen, dann können Sie numpy.vectorize verwenden, um alle Schleifen auf Kosten der Lesbarkeit entfernen (nicht getestet):

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

Das ist ausgezeichnet, danke. Ich erwartete ursprünglich, dass die Schleife langsam sein würde, und dachte, dass es vielleicht besser wäre, einen Vektor/eine Matrix zu passieren. Hast du einen Blick darauf? – Travis

+0

@Travis Die Schleife kann eine gewisse Verzögerung verursachen, aber dies ist nicht mehr als ein paar Sekunden für eine Million Zeilen. Hier ist eine schnellere Methode: 'df ['99th_percentile'] = [numpy.percentile (x, 99) für x in df [Spalten] .Values]' , die fast keinen Overhead hat, ist aber ein bisschen hässlicher . Überprüfen Sie meine Antwort bearbeiten für den schnellsten Wert, den ich mir vorstellen kann. – mxbi

0

Etwas von @mxbi modifiziert.

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) 
Verwandte Themen