Python 按输出打印部件

Python 按输出打印部件,python,pandas,Python,Pandas,根据前面的问题,我有一个数据帧(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

根据前面的问题,我有一个数据帧(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)的“功能”的正确和错误百分比计算groupby的百分比

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
            Percentage
ID Feature            
0  False           20
   True            30
我还可以按“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
1  False           30
   True            20
            Percentage
ID Feature            
0  False           20
   True            30
我的问题是如何进一步,只打印ID=0和Feature='False'的单个输出,这样我就可以在生成的Excel中的每个条件下打印到不同的工作表上(当我增加行号时,处理多个日志会更容易)

比如:

            Percentage
ID Feature            
0  False           20
然后分别为Feature='True':

            Percentage
ID Feature            
0  True           30
我尝试使用此方法,但得到了错误-TypeError:invalid type comparison

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

您只需使用
百分比
结果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
,依此类推

还有进一步的解释和示例代码

您可以使用
get\u level\u 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
,否则您将引发
keyrerror

我不确定代码是否会产生您所说的答案。你的
/(len(df)*100)
看起来它把100放在了错误的地方(你用额外的因子100除以,而不是用分数乘以100得到一个百分比)。你是正确的DSM-我把右括号放在了错误的地方,我编辑了上面的代码,应该是(len(df))*100谢谢EdChum,你又把我从几个小时的混乱中救了出来!你的解决方案完全符合我的期望。