Pandas - 基于非数值数据的Pivot表

时间:2018-05-28 07:06:26

标签: python pandas pivot-table

我有一个pandas df,格式如下:

$_GET['search'] 

我想得到输出:

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

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

3 个答案:

答案 0 :(得分:2)

使用melt首先使用groupby value_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

答案 1 :(得分:2)

pivot_table是一种可能的解决方案:

i = df.melt('TARGET')
j = i.pivot_table(
    index='TARGET', columns=['variable', 'value'], aggfunc='size', fill_value=0
)

print(j)

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

现在,对于%s的第二部分,你可以除以总和(就像@jezrael所做的那样):

j.div(j.sum(axis=1), axis=0).astype(str).add('%')

variable FLAG_OWN_CAR        FLAG_OWN_REALTY       
value               N      Y               N      Y
TARGET                                             
0                0.0%   0.5%           0.25%  0.25%
1               0.25%  0.25%           0.25%  0.25%

答案 2 :(得分:2)

这是使用UpdateId()pd.concat的方式,即

get_dummies