2015-02-10 20 views
10

Wie erstellt man eine neue Bin/Bucket Variable mit pd.qut in Python?Python Pandas Erstellen neuer Bin/Bucket Variablen mit pd.qcut

Dies scheint für erfahrene Benutzer elementar zu sein, aber ich war nicht super klar in diesem und es war überraschend nicht intuitiv auf der Suche nach on stack overflow/google. Ein gründliches Suchen ergab dies (Assignment of qcut as new column), aber es beantwortete meine Frage nicht ganz, weil es nicht den letzten Schritt machte und alles in Behälter legte (d. H. 1,2, ...).

Antwort

3

EDIT: Die folgende Antwort ist nur gültig für Versionen von Pandas weniger als 0.15.0. Wenn Sie Pandas 15 oder höher verwenden, finden Sie unter:

data3['bins_spd'] = pd.qcut(data3['spd_pct'], 5, labels=False) 

Dank @unutbu für Hinweis darauf. :)

Angenommen, Sie haben einige Daten, die Sie ablegen möchten, in meinem Fall Optionen Spreads, und Sie möchten eine neue Variable mit den Buckets entsprechend jeder Beobachtung machen. Der Link oben erwähnt, dass Sie dies tun können:

print pd.qcut(data3['spd_pct'], 40) 

(0.087, 0.146] 
(0.0548, 0.087] 
(0.146, 0.5] 
(0.146, 0.5] 
(0.087, 0.146] 
(0.0548, 0.087] 
(0.5, 2] 

, die Sie gibt, was die bin Endpunkte sind, die für jede Beobachtung entsprechen. Wenn Sie jedoch für jede Beobachtung die entsprechenden Fachnummern möchten, dann können Sie dies tun:

print pd.qcut(data3['spd_pct'],5).labels 

[2 1 3 ..., 0 1 4] 

setzen sie alle zusammen, wenn Sie nur die Fachnummern eine neue Variable erstellen mit möchte, sollte dies genügen:

data3['bins_spd']=pd.qcut(data3['spd_pct'],5).labels 

print data3.head() 

    secid  date symbol symbol_flag  exdate last_date cp_flag 0 5005 1/2/1997 099F2.37   0 1/18/1997   NaN  P 
1 5005 1/2/1997 09B0B.1B   0 2/22/1997 12/3/1996  P 
2 5005 1/2/1997 09B7C.2F   0 2/22/1997 12/11/1996  P 
3 5005 1/2/1997 09EE6.6E   0 1/18/1997 12/27/1996  C 
4 5005 1/2/1997 09F2F.CE   0 8/16/1997   NaN  P 

    strike_price best_bid best_offer  ...  close volume_y return 0   7500  2.875  3.2500  ...  4.5  99200 0.074627 
1   10000  5.375  5.7500  ...  4.5  99200 0.074627 
2   5000  0.625  0.8750  ...  4.5  99200 0.074627 
3   5000  0.125  0.1875  ...  4.5  99200 0.074627 
4   7500  3.000  3.3750  ...  4.5  99200 0.074627 

    cfadj_y open cfret shrout  mid spd_pct bins_spd 
0  1 4.5  1 57735 3.06250 0.122449   2 
1  1 4.5  1 57735 5.56250 0.067416   1 
2  1 4.5  1 57735 0.75000 0.333333   3 
3  1 4.5  1 57735 0.15625 0.400000   3 
4  1 4.5  1 57735 3.18750 0.117647   2 

[5 rows x 35 columns] 

Hoffe das hilft jemand anderem. Zumindest sollte es einfacher sein, jetzt zu suchen. :)

7

In Pandas 0.15.0 oder neuer, pd.qcut wird eine Serie zurückgeben, nicht eine kategorische, wenn die Eingabe eine Serie ist (wie es ist, in Ihrem Fall) oder wenn labels=False. Wenn Sie labels=False festlegen, gibt qcut eine Reihe mit den ganzzahligen Indikatoren der Bins als Werte zurück.

So zukunftssicher Ihr Code, könnten Sie

data3['bins_spd'] = pd.qcut(data3['spd_pct'], 5, labels=False) 

oder, passieren eine NumPy Array pd.qcut verwenden, so dass Sie eine kategorische als Rückgabewert erhalten. Beachten Sie, dass das Categorical-Attribut labels is deprecated. Verwenden Sie stattdessen codes:

data3['bins_spd'] = pd.qcut(data3['spd_pct'].values, 5).codes 
+0

Großartig! Das war mir nicht bewusst. Danke, dass du es aufgezeigt hast. – sfortney