Подсчитать количество значений нескольких столбцов на каждый столбец и дополнительный столбец категории - PullRequest
1 голос
/ 29 марта 2020

У меня есть фрейм данных, содержащий несколько столбцов с 0 и 1 (A, B), а также один столбец (C), указывающий категорию строки. Теперь я хотел бы посчитать значения 0 и 1 для каждого столбца и категории.

import pandas as pd

test_data = {'A': [0,0,1,1,1,0],
             'B': [0,1,0,1,0,1],
             'C': ['a','a','b','b', 'c', 'c']}

df = pd.DataFrame(test_data)

Я попытался выяснить, как я могу изменить порядок данных, используя pd.piovt_table, однако мне не удалось получить правильное преобразование. Я пробовал следующее:

table = pd.pivot_table(df, columns = ['C'], index=['A'], aggfunc='count')
print('0', table)

, что приведет к следующему выводу:

0      B          
C    a    b    c
A               
0  2.0  NaN  1.0
1  NaN  2.0  1.0

Моя цель - получить следующий вывод:

0      B           |   A            # columns A and B
C    a a  b b  c c | a a  b b  c c  # row category based on C
     0 1  0 1  0 1 | 0 1  0 1  0 1  # 0 and 1 values of the columns A and B

     1 1  1 1  1 1 | 2 0  0 2  1 1  # counts

[Редактировать] или следующий вывод:

0      B     |   A      # columns A and B
C    a  b  c | a  b  c  # row category based on C
  0| 1  1  1 | 2  0  1
  1| 1  1  1 | 0  2  1

Может ли кто-нибудь помочь мне с этим? Спасибо!

1 Ответ

0 голосов
/ 29 марта 2020

Я думаю, вам нужно DataFrame.melt ранее

Первый случай это второй с unstack ()

new_df = (df.melt('C')
            .groupby(['variable','C'])['value']
            .value_counts().unstack(fill_value=0)
            .stack()
            .to_frame().T
            .rename_axis(index=None,columns=[0,'C',None])
            .sort_index(axis=1, ascending=[False,True,True]))
print(new_df)
0  B                 A               
C  a     b     c     a     b     c   
   0  1  0  1  0  1  0  1  0  1  0  1
0  1  1  1  1  1  1  2  0  0  2  1  1

Второй регистр это первый со стеком ()

new_df = (df.melt('C').groupby(['C','variable'])['value']
            .value_counts().unstack(['variable','C'],fill_value=0)
            .sort_index(axis=1, ascending=[False, True])
            .rename_axis(columns=[0,'C'],index=None))
print(new_df)

или

new_df = (df.melt('C')
            .pivot_table(columns=['variable','C'],
                         index='value',
                         aggfunc='size',
                         fill_value=0)
            .rename_axis(index=None, columns=[0,'C'])
            .sort_index(axis=1, ascending=[False, True]))

Выход

0  B        A      
C  a  b  c  a  b  c
0  1  1  1  2  0  1
1  1  1  1  0  2  1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...