pandas 多列的交叉表简化视图

pandas crosstab simplified view of multiple columns

我已经提到了帖子 and 。不要将其标记为重复

我有一个如下所示的数据框

id,status,country,amount,qty
1,pass,USA,123,4500
1,pass,USA,156,3210
1,fail,UK,687,2137
1,fail,UK,456,1236
2,pass,AUS,216,324
2,pass,AUS,678,241
2,nan,ANZ,637,213
2,pass,ANZ,213,543

sf = pd.read_clipboard(sep=',')

我想从每一列中获取值的百分比作为单独的列

所以,在这个的帮助下,我尝试了下面的方法

方法 - 1 没有给出预期的输出形状

(pd.crosstab(sf['id'],[sf['status'].fillna('nan'),sf['country'].fillna('nan')],normalize=0)
          .drop('nan', 1)
          .mul(100)).reset_index()

方法 - 2 - 没有给出预期的输出

sf_inv= sf.melt()
pd.crosstab(sf_inv.value, sf_inv.variable)

我希望我的输出如下所示

可以使用crosstab with normalize='index' on your different columns and concat结果:

pd.concat([pd.crosstab(sf['id'], sf[c], normalize='index')
           for c in ['status', 'country']], axis=1).mul(100).add_suffix('_pct')

输出:

    fail_pct  pass_pct  ANZ_pct  AUS_pct  UK_pct  USA_pct
id                                                       
1       50.0      50.0      0.0      0.0    50.0     50.0
2        0.0     100.0     50.0     50.0     0.0      0.0
处理 NaN:
pd.concat([pd.crosstab(sf['id'], sf[c].fillna('NA'), normalize='index')
             .drop(columns='NA', errors='ignore')
           for c in ['status', 'country']], axis=1).mul(100).add_suffix('_pct')

输出:

    fail_pct  pass_pct  ANZ_pct  AUS_pct  UK_pct  USA_pct
id                                                       
1       50.0      50.0      0.0      0.0    50.0     50.0
2        0.0      75.0     50.0     50.0     0.0      0.0