在 python pandas 中打印交叉表

Printing crosstab in python pandas

我有一个关于汽车品牌和类型的 DataFrame。

我用过这个:

conditional_p = pd.crosstab(cars_selected_df.type, cars_selected_df.make, margins=True, normalize='columns')

这给了我想要的条件概率计算。但是,我无法在使用 pd.crosstab.

后打印条件概率 %

如果我打印 conditional_p,它看起来像这样:

make        alfa-romero      audi  bmw  ...  volkswagen     volvo       All
type                              ...                                
standard            1.0  0.714286  1.0  ...    0.833333  0.545455  0.819512
turbo               0.0  0.285714  0.0  ...    0.166667  0.454545  0.180488

我希望我的输出打印成这样:

Prob(type=standard | make=alfa-romero) =  100 %
Prob(type=turbo | make=alfa-romero) =  0 %
Prob(type=standard | make=audi) =  71.43 %
Prob(type=turbo | make=audi) =  28.57 %
...

对于我拥有的所有品牌(有 20 种)和类型(2 种不同类型)。我在想我可以使用 lamda 函数来执行此操作,但是,我如何引用交叉表求解的条件概率值?我是否必须使用 df.stack() 将交叉表返回到 DataFrame 中,然后我才能在我的 lambda 函数中引用它?我试过了,但还是一事无成。

这是我的尝试:

y = conditional_p.stack()
cond_probabilities_df =  pd.DataFrame({'car_type':cars_df['type'].unique(), 'make_name':cars_df['make'].unique(), 'cond_prob' : y})
print_cond_probability = lambda x: print('Prob(type='+x.car_type+') | make= '+x.make_name+'= '+x.cond_prob+'%')

我收到了这个错误: ValueError:数组的长度必须相同

旁注:我有点新手,不使用 groupby,只使用 pandas。 感谢您的帮助。

如果我完全误解了这个问题,请纠正我,但你要找的是这样的:

for make in conditional_p.columns:
    for typ in conditional_p.index:
        print(f'Prob(type={typ} | make={make}) = {conditional_p[make][typ] * 100:.2f}')