pandas агрегированное значение подсчитывается по нескольким столбцам в итоговый фрейм данных - PullRequest
0 голосов
/ 14 апреля 2020

Я ищу способ табулирования значений pandas для столбца в сводную таблицу. Я нашел способ получить то, что я хочу, но Pandas должен иметь лучший способ сделать это.

фрейм данных имеет несколько этапов теста с данными 'P' 'F' или '' для каждого тестовый прогон.

step1 = list('PPFP PFP ')
step2 = list('PFFP  FPF')
step3 = list(' PPPFFPFP')
step4 = list(' PPFPF PP')

df = pd.DataFrame({'step1': step1,'step2':step2, 'step3':step3,'step4':step4})

  step1 step2 step3 step4
0     P     P            
1     P     F     P     P
2     F     F     P     P
3     P     P     P     F
4                 F     P
5     P           F     F
6     F     F     P      
7     P     P     F     P
8           F     P     P

вывод, который я ищу:

   step1  step2  step3  step4
P      5      3      5      5
F      2      4      3      2
       2      2      1      2

Я смог решить эту проблему, просматривая каждый столбец, выполняя value_counts, затем добавляя его к выходной массив, но это кажется неуклюжим.

df2 = pd.DataFrame(index=['P', 'F', ' '])

for i in range(len(df.columns)):
    df2[df.columns.tolist()[i]] = df.iloc[:, i].value_counts(dropna=False)

Есть ли более элегантный способ выполнить sh это?

1 Ответ

2 голосов
/ 14 апреля 2020

Используйте DataFrame.apply с value_counts:

df2 = df.apply(pd.value_counts)
print (df2)
   step1  step2  step3  step4
       2      2      1      2
F      2      4      3      2
P      5      3      5      5

Для изменения порядка строк добавьте DataFrame.reindex к списку всех значений в индексе в список в ожидаемом порядке:

df2 = df.apply(pd.value_counts).reindex([' ','P','F'])
print (df2)
   step1  step2  step3  step4
       2      2      1      2
P      5      3      5      5
F      2      4      3      2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...