Python 熊猫-基于非数值数据的数据透视表

Python 熊猫-基于非数值数据的数据透视表,python,pandas,pivot-table,Python,Pandas,Pivot Table,我有一个熊猫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

我有一个熊猫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%
我尝试过透视表,但无法解决此问题。

使用和来首先重塑形状:

然后按每行的
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
用于使用和首先重塑形状:

然后按每行的
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

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

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

现在,对于%s的第二部分,您可以除以总和(如@jezrael has done):


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

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

现在,对于%s的第二部分,您可以除以总和(如@jezrael has done):


这里有一种使用
pd.concat
get\u dummies
的方法,即

df = df.set_index('TARGET')

o = pd.concat([pd.get_dummies(df[col]) for col in df], axis=1, keys=df.columns).sum(level=0)

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

这里有一种使用
pd.concat
get\u dummies
的方法,即

df = df.set_index('TARGET')

o = pd.concat([pd.get_dummies(df[col]) for col in df], axis=1, keys=df.columns).sum(level=0)

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

也许在末尾添加
.sort\u index(axis=1)
会使输出更清晰也许在末尾添加
.sort\u index(axis=1)
会使输出更清晰我刚刚意识到-你答案的最后一部分的小数点位置不正确。@KamilaAmbro什么?怎么用?这和另一个答案完全一样?我刚刚意识到-你答案的最后一部分小数点位置不正确。@KamilaAmbro什么?怎么用?这和另一个答案完全一样?