我有以下格式的pandas df:

TARGET FLAG_OWN_CAR FLAG_OWN_REALTY
0      Y            N
1      N            N
0      Y            Y
1      Y            Y


我想获得输出:

        FLAG_OWN_CAR   FLAG_OWN_REALTY
TARGET  Y        N     Y         N
0       2        0     1         1
1       1        1     1         1


按照上面的内容,我也想按%的列获取值,即:

        FLAG_OWN_CAR   FLAG_OWN_REALTY
TARGET  Y        N     Y         N
0       50%      0%    25%       25%
1       25%      25%   25%       25%


我已经尝试过数据透视表,但无法弄清楚。

最佳答案

首先使用meltgroupbyvalue_countsunstack重塑形状:

df = (df.melt('TARGET')
       .groupby(['TARGET','variable'])['value']
       .value_counts()
       .unstack([1,2], fill_value=0)
       .rename_axis((None, None), 1))
print (df)

       FLAG_OWN_CAR FLAG_OWN_REALTY    FLAG_OWN_CAR
                  Y               N  Y            N
TARGET
0                 2               1  1            0
1                 1               1  1            1

然后将每行除以sum
df = df.div(df.sum(axis=1), axis=0)
print (df)

       FLAG_OWN_CAR FLAG_OWN_REALTY       FLAG_OWN_CAR
                  Y               N     Y            N
TARGET
0              0.50            0.25  0.25         0.00
1              0.25            0.25  0.25         0.25

10-06 00:01
查看更多