我有以下格式的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%
我已经尝试过数据透视表,但无法弄清楚。
最佳答案
首先使用melt
和groupby
,value_counts
和unstack
重塑形状:
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