Как создать в DataFrame среднее значение внутреннего уровня многостолбечного индекса DataFrame для панд с одинаковыми именами? - PullRequest
0 голосов
/ 02 марта 2019

Итак, допустим, у меня есть двухуровневый DataFrame для панд, с кластером в качестве уровня 0 и подкластером в качестве уровня 1 в мультииндексе:

Cluster        1         2         3
subcluster  1  1  2   1  2  2   1   2   3

A           11 12 13  13 20 21  16 127 18
B           14 15 16  14 19 22  16 027 19
C           17 18 19  15 18 23  16 71  12
D           20 21 22  16 17 24  16 71  30

Кем бы я хотел бытьМожно создать DataFrame, состоящий из среднего значения каждого подкластера.Обратите внимание, что некоторые из подкластеров названы одинаково из-за номенклатуры набора данных (например, каждый кластер 1 и 2 имеет два разных подкластера, как показано выше. Мой фактический набор данных намного больше, с 15 различными кластерами и максимумомиз 29 подкластеров, в общей сложности около 40 000 столбцов.

Использование df.groupby(level=1, axis=1).mean() не работает, так как оно не различает, например, кластер 1 подкластер 1 и кластер 2 подкластер 1, что я хотел быdo. Другими словами, он создал бы DataFrame со средствами, который имеет только 3 столбца, по одному для каждого подкластера, тогда как я хотел бы ограничить его, чтобы найти средства для каждого подкластера в его кластере. Использование df[1].groupby(level=0, axis=1).mean() делает работунасколько я могу судить, но это означает, что я должен сделать это для каждого из 15 кластеров, а затем объединить все из них, чтобы в конечном итоге, где я хочу.

Мой вопрос, есть ли быстрее, большеэлегантный способ сделать это. Кроме того, предпочтительно способ, который хранит информацию о кластере происхождения. Мой способ сделать этоне показывает основной кластер, это означает, что я должен вручную добавить это в каждый из DataFrame перед объединением.

Надеюсь, мой вопрос ясен.

1 Ответ

0 голосов
/ 02 марта 2019

Используйте mean с указанием обоих уровней:

df1 = df.mean(axis=1, level=[0,1])

Это то же самое, что и:

df1 = df.groupby(level=[0,1], axis=1).mean()

print (df1)
Cluster     1           2           3             
            1     2     1     2     1      2     3
A        11.5  13.0  13.0  20.5  16.0  127.0  18.0
B        14.5  16.0  14.0  20.5  16.0   27.0  19.0
C        17.5  19.0  15.0  20.5  16.0   71.0  12.0
D        20.5  22.0  16.0  20.5  16.0   71.0  30.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...