打印Pandas groupby输出的部分

时间:2015-08-25 15:21:12

标签: python pandas

继续之前的问题Pandas Percentage count on a DataFrame groupby我有一个Dataframe(mydf),格式如下:

Index   Feature ID  Stuff1  Stuff2
1       True    1   23      12
2       True    1   54      12
3       False   0   45      67
4       True    0   38      29
5       False   1   32      24
6       False   1   59      39
7       True    0   37      32
8       False   0   76      65
9       False   1   32      12
10      True    0   23      15
..n     True    1   21      99

在上一个问题的答案的帮助下,我可以使用此方法根据每个'ID'(0或1)的'特征'的真假百分比计算分组的百分比

percentages = pd.DataFrame({'Percentage': mydf.groupby(('ID', 'Feature')).size() / (len(df)*100)})

这打印为:

            Percentage
ID Feature            
0  False           20
   True            30
1  False           30
   True            20

我也可以按照'ID'分离上面相同的方法,所以对于ID 0,我会使用以下内容:

percentages = pd.DataFrame({'Percentage': mydf[(mydf['ID'] == 0)].groupby(('ID','Feature')).size() / (len(df))*100})

这打印为:

            Percentage
ID Feature            
0  False           20
   True            30

我的问题是我如何更进一步只打印单个输出,例如ID = 0和Feature ='False',这样我就可以在生成的每个条件下打印到不同的工作表(在工作时更容易我增加行号的几个日志。)

类似的东西:

            Percentage
ID Feature            
0  False           20

然后单独为Feature =='True':

            Percentage
ID Feature            
0  True           30

我试过这个方法,但是我得到了错误 - TypeError:无效的类型比较

percentages = pd.DataFrame({'Percentage': mydf[(mydf['ID'] == 0)&(mydf['Feature'] == 'False')].groupby(('ID','Feature')).size() / (len(df)*100)})

1 个答案:

答案 0 :(得分:3)

你可以使用你的percentages结果df,只需索引到多索引df:

In [81]:
percentages = pd.DataFrame({'Percentage': df.groupby(('ID', 'Feature')).size() / (len(df)*100)})
percentages

Out[81]:
            Percentage
ID Feature            
0  False         0.002
   True          0.003
1  False         0.003
   True          0.002

In [83]:    
print(percentages.loc[(0,False)])
print(percentages.loc[(0,True)])
Percentage    0.002
Name: (0, False), dtype: float64
Percentage    0.003
Name: (0, True), dtype: float64

此处的语法使用元组索引到每个级别,此处(0,False)索引ID 0,然后下一个值为1级False,依此类推。

还有一个解释和示例代码here

您可以使用get_level_values获取索引值:

In [86]:
print(percentages.index.get_level_values(0))
print(percentages.index.get_level_values(1))

Int64Index([0, 0, 1, 1], dtype='int64', name='ID')
Index([False, True, False, True], dtype='object', name='Feature')

您可以在上面调用unique来获取唯一值,然后迭代它们:

In [87]:
for level_0 in percentages.index.get_level_values(0).unique():
    for level_1 in percentages.index.get_level_values(1).unique():
        print(percentages.loc[level_0, level_1])

Percentage    0.002
Name: (0, False), dtype: float64
Percentage    0.003
Name: (0, True), dtype: float64
Percentage    0.003
Name: (1, False), dtype: float64
Percentage    0.002
Name: (1, True), dtype: float64

以上假设所有ID都存在True / False,否则您将提出KeyError