Группировать по нескольким столбцам в одну таблицу

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

У меня есть набор данных, который выглядит следующим образом:

 ID   HEMO_Counts   PLATE_Counts  ESR_Counts  CRP_Counts  COVID POS
0          23                       2          6          1
1                                                         0
2          54          23                                 0
3          234                      4          9          1
4                      75           6                     0
5          64                                 16          1
  

Я хочу создать таблицу, в которой каждое лабораторное значение (HEMO_Counts, PLATE_Counts, ESR_Counts, CRP_Counts) имеет значение индекса, а количество каждого лабораторного значения разделено на два столбца по COVID POS

 LAB     0    1
Hemo    1    3
Plate   2    0
ESR     1    2
CRP     0    3
  

Я написал следующий код, но вывод неверен:

 LABS_VAR=['HEMO_Counts','PLATE_Counts','ESR_Counts','CRP_Counts']

for lab in LABS_VAR:
    TEST=pd.pivot_table(df_merged2,values=[lab],  columns='Covid_pos', aggfunc=lambda x: len(x.unique()))
    TESTING = pd.DataFrame(TEST.to_records()).rename(columns={'index':'Lab'})
    DF=TESTING.append(TESTING)
    
Labs_Count_Results = pd.DataFrame(DF)
  

введите описание изображения здесь

Я на правильном пути или есть более простой способ сделать это?

Комментарии:

1. df.groupby('COVID POS').count().reset_index().T

2. Спасибо — не могли бы вы добавить больше контекста к этому решению?

3. @Matt всегда был поклонником df.groupby('COVID_POS', as_index=False).count().T

4. Что делает буква «T» в этой строке кода?

5. @Raven T предназначен для транспонирования фрейма данных..

Ответ №1:

Сначала filter столбцы, содержащие _Counts , затем groupby эти столбцы с помощью COVID POS и agg count , наконец, с помощью rstrip удаления _Counts части из индекса:

 d = df.filter(like='_Counts').groupby(df['COVID POS'])
      .count().T.rename_axis(columns='LAB')
      
d.index = d.index.str.rstrip('_Counts')
  

 LAB    0  1
HEMO   1  3
PLATE  2  0
ESR    1  2
CRP    0  3