Pandas - сводная таблица на основе нечисловых данных - PullRequest
0 голосов
/ 28 мая 2018

У меня есть 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%

Я пробовал сводные таблицы, но не могу понять.

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

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%
0 голосов
/ 28 мая 2018

Вот способ использования pd.concat и get_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
0 голосов
/ 28 мая 2018

Используйте melt для изменения формы сначала с groupbyvalue_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
...