2017-05-17 11 views
0

Converting habe ich ein groupby Objekt:eine Pandas Serie zu einem wohlgeformten Datenrahmen

g = dfchurn.groupby('ID')['isconfirm'].value_counts().groupby(level=0).apply(lambda x: x/float(x.sum())) 
type(g) 
Out[230]: pandas.core.series.Series 
g.head(5) 
Out[226]: 
ID   isconfirm 
0000  0   0.985981 
      1   0.014019 
0064  0   0.996448 
      1   0.003552 
0080  0   0.997137 

Mein Ziel ist die Top-100-IDs sortiert nach Verhältnis absteigend (die rechte Spalte), wo isconfirm = 0 zu erhalten .
Um dies zu tun, überlegte ich, zu einem schönen Datenrahmen mit gut benannten Spalten, so dass ich die oberen IDs in Bezug auf das Verhältnis abfragen kann, wenn isconfirm = 0.

Ich habe versucht, zum Beispiel

gdf = g.to_frame() 
gdf.unstack(level=1) 
gdf.head(5) 

      isconfirm   
isconfirm   0   1 
ID      
0000  0.985981 0.014019 
0064  0.996448 0.003552 

gdf.columns 
Out[227]: Index([u'isconfirm'], dtype='object') 

Das ist nicht überall geführt haben. Es muss einen sauberen und knappen Weg geben, dies zu tun.

Antwort

1

Sie können alle Zeilen auswählen, in dem Verwendung ist:

In [90]: g.loc[:, 0] 
Out[90]: 
ID 
0 0.827957 
1 0.911111 
2 0.944954 
3 0.884956 
4 0.931373 
5 0.869048 
6 0.941176 
7 0.884615 
8 0.901961 
9 0.930693 
Name: isconfirm, dtype: float64 

Die 0 in [:, 0] bezieht sich auf den Wert in der zweiten Niveau des Indexes. So konnte man die ID s finden in den oberen 100 Werten entsprechen, mit:

In [93]: g.loc[:, 0].sort_values(ascending=False).head(100) 
Out[93]: 
ID 
2 0.944954 
6 0.941176 
4 0.931373 
9 0.930693 
1 0.911111 
8 0.901961 
3 0.884956 
7 0.884615 
5 0.869048 
0 0.827957 
Name: isconfirm, dtype: float64 

In [94]: g.loc[:, 0].sort_values(ascending=False).head(100).index 
Out[94]: Int64Index([2, 6, 4, 9, 1, 8, 3, 7, 5, 0], dtype='int64', name='ID') 

das Ergebnis oben zu erzeugen, definiert ich g auf diese Weise:

import numpy as np 
import pandas as pd 
np.random.seed(2017) 

N = 1000 
dfchurn = pd.DataFrame({'ID':np.random.randint(10, size=N), 
         'isconfirm': np.random.choice(2, p=[0.9, 0.1], size=N)}) 
g = dfchurn.groupby('ID')['isconfirm'].value_counts().groupby(level=0).apply(lambda x: x/float(x.sum())) 
0

ich den Hinweis in einem verwandten Frage gefunden:

gdf.unstack(level=1) 
gdf = gdf.add_suffix('_ratio').reset_index() # KEY STEP 

gdf.columns # friendly columns now 
Index([u'ID', u'isconfirm', u'isconfirm_ratio'], dtype='object') 

gdf[gdf['isconfirm_ratio'] > 0.999] # e.g. a filter like this works now or a sort 
+0

Die Antwort, die ich doesn akzeptiert mache nicht einmal einen Datenrahmen - arbeitet direkt mit der Serie 'g' - also es ist terser. –

Verwandte Themen