2013-07-03 6 views
5

ich langsam von bewegt bin R zu Python + Pandas, und ich habe ein Problem mit Blick auf mich nicht lösen kann ...Pandas - eine Spalte mit dem Wert basierend auf exisitng einem (bins, qcut) in

Ich muss Werte aus einer Spalte diskretisieren, indem Sie sie den Behältern zuweisen und eine Spalte mit diesen Behälternamen zu Original DataFrame hinzufügen. Ich versuche, pandas.qcut zu verwenden, aber das resultierende Categorical Objekt scheint nicht gut mit DataFrame zu spielen.

Ein Beispiel:

import pandas as pd 
df1 = pd.DataFrame(np.random.randn(10), columns=['a']) 
df1['binned_a'] = pd.qcut(df1['a'],4) 

Nun, wenn ich versucht, aufzurufen describe auf df1 kann die neue Spalte nicht sehen:

>>> df1.describe() 
       a 
count 10.000000 
mean 0.594072 
std  1.109981 
min -0.807307 
25% -0.304550 
50%  0.545839 
75%  1.189487 
max  2.851922 

Allerdings ist es anscheinend gibt:

>>> df1 
      a   binned_a 
0 0.190015 (-0.305, 0.546] 
1 0.140227 (-0.305, 0.546] 
2 1.380000 (1.189, 2.852] 
3 -0.522530 [-0.807, -0.305] 
4 -0.452810 [-0.807, -0.305] 
5 2.851922 (1.189, 2.852] 
6 -0.807307 [-0.807, -0.305] 
7 0.901663 (0.546, 1.189] 
8 1.010334 (0.546, 1.189] 
9 1.249205 (1.189, 2.852] 

Was mache ich falsch? Mein gewünschtes Ergebnis ist eine Spalte mit 4 eindeutigen String-Werten, die die Bins beschreiben (wie Faktoren in R).


EDIT:

Wie richtig von Dan entdeckt, die summary() Methode nicht Spalt mit Nur-Text-Daten zeigen, und so ist das mysteriöse Problem gelöst :) Vielen Dank!

Antwort

3

Ich war noch nie ein R-Benutzer, aber wenn ich Sie verstehe, möchten Sie die Daten in Bins gruppieren und jede Bin beschreiben.

In [9]: df.groupby('binned_a').describe().unstack() 
Out[9]:    a             \ 
        count  mean  std  min  25%  50% 
binned_a                  
(-0.113, 0.109]  2 0.025114 0.010264 0.017856 0.021485 0.025114 
(-0.337, -0.113]  2 -0.282838 0.056445 -0.322751 -0.302794 -0.282838 
(0.109, 0.563]  3 0.354481 0.214402 0.134978 0.250027 0.365076 
[-1.842, -0.337]  3 -1.003969 0.765167 -1.841622 -1.335073 -0.828523 


        75%  max 
binned_a        
(-0.113, 0.109] 0.028742 0.032371 
(-0.337, -0.113] -0.262882 -0.242925 
(0.109, 0.563] 0.464233 0.563390 
[-1.842, -0.337] -0.585142 -0.341762 

Um categoricals ganz zu vermeiden, siehe https://stackoverflow.com/a/17150734/1221924

+0

nicht genau, ich in der Tat frage mich nur, warum die neue 'binned_a' Spalte nicht in dem' describe' Ergebnis zeigt ... Aber ich habe versucht, 'df1 ['binned_a'] = pd.Series (pd.qcut (df1 ['a'], 4))' und immer noch kein Ergebnis ... –

+1

Die "Bins" in '' binned_a'' sind Strings , so beschreibe() '' ignoriert sie. Würde genau über die Mülleimer du gerne beschreiben? –

+0

Ahhh, in der Tat ... Ich dachte, wenn eine Spalte nicht in 'describe()' angezeigt wird, dann stimmt etwas nicht (in R text Spalten werden auch in summy angezeigt) ... So scheint es jetzt klar zu sein, danke viel! –

Verwandte Themen