Pandas кросс-таблица с верхними элементами - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть фрейм данных с двумя столбцами, например:

| index | class1 | class2 |
|-------|--------|--------|
| 0     | a      | z      |
| 1     | a      | z      |
| 2     | a      | y      |
| 3     | b      | x      |
| 4     | b      | y      |
| 5     | b      | x      |
| 6     | c      | z      |
| 7     | c      | z      |
| 8     | c      | x      |

Я хочу рассчитать статистику по одному классу за два. В результате я ожидаю таблицу с одним классом в виде строк, вторым классом в виде столбцов и значений на пересечении. В моем случае может быть большое количество классов как в class1, так и в class2. Поэтому в столбцах должны быть только вершины объектов class2 в соответствующем классе 1

. В качестве примера выведите:

|   | a    |   | b    |   | c    |
|---|------|---|------|---|------|
| x | 0    |   | 0.33 |   | 0.33 |
|   |      |   |      |   |      |
| y | 0.33 |   | 0.33 |   | 0    |
|   |      |   |      |   |      |
| z | 0.66 |   | 0.33 |   | 0.66 |

Мне нравится делать это, используя crosstab fun c:

pd.crosstab(index=df['class1'],
            columns=df['class2'],
            normalize='index')

Вопрос:

Как оставить только классы top class2 всеми классами class1? Также есть какие-нибудь идеи, как сделать агрегацию кроме croostab?

1 Ответ

0 голосов
/ 01 апреля 2020

Вы были почти там, вы не хотите нормализовать более index, но более columns:

dfn = pd.crosstab(index=df['class2'],
                  columns=df['class1'],
                  normalize='columns').round(2)

print(dfn)
class1     a     b     c
class2                  
x       0.00  0.67  0.33
y       0.33  0.33  0.00
z       0.67  0.00  0.67

Чтобы удалить имена индексов и столбцов:

dfn = (pd.crosstab(index=df['class2'],
                   columns=df['class1'],
                   normalize='columns')
       .round(2)
       .rename_axis(None)
       .rename_axis(None, axis=1)
      )
print(dfn)
      a     b     c
x  0.00  0.67  0.33
y  0.33  0.33  0.00
z  0.67  0.00  0.67
...