继续之前的问题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)})
答案 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