2017-05-17 22 views
0

我有一个GROUPBY对象:转换一个熊猫系列,以良好的成形数据帧

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 

我的目标是获得前100名的ID通过比下降(最右列)排序,其中isconfirm = 0 。
要做到这一点,我想到了一个很好的数据框与良好的命名列,所以我可以在isconfirm = 0时以比率的形式查询顶部ID。

我试过了,例如,

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') 

这并没有导致任何地方。必须有一个干净而简洁的方式来做到这一点。

回答

1

您可以选择所有行isconfirm是0使用g.loc

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 

[:, 0]0指值在第二指数的水平。 因此,您可以用找到对应的前100值ID S:

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') 

要产生上述结果,我定义g这样:

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

我发现暗示在一个相关的问题:

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

我接受没有按答案甚至没有制作一个数据框 - 直接与系列'g'合作 - 因此它更加简洁。 –