В мультииндексированном фрейме данных .columns.levels [1] после groupby дает столбцы всего фрейма данных. - PullRequest
2 голосов
/ 03 мая 2019

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

df1 = pd.DataFrame(data=np.random.randint(0, 100, (4, 5)), columns=list('ABCDE'))
df2 = pd.DataFrame(data=np.random.randint(0, 100, (4, 5)),columns=list('AGHIJ'))
df3 = pd.DataFrame(data=np.random.randint(0, 100, (4, 5)),columns=list('ALMNP'))
dfs = []
dfs.append(df1)
dfs.append(df2)
dfs.append(df3)
result = pd.concat(dfs, axis=1, keys=range(len(dfs)))

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

print(result.groupby(axis=1, level=0).get_group(0).columns.levels[1])

дает мне все столбцы df1, df2 и df3

Ответы [ 2 ]

3 голосов
/ 03 мая 2019

Это проблема с unused levels.Когда у вас есть MultiIndex, уровни все еще там, просто не используются, так что вы можете удалить их при необходимости:

result.groupby(axis=1, level=0).get_group(0).columns.remove_unused_levels().levels[1]
#Index(['A', 'B', 'C', 'D', 'E'], dtype='object')

Чтобы увидеть, что все еще там, посмотрите на столбцы.Для первого уровня по-прежнему существует 13 значений, но эта группа ссылается только на первые 5.

print(result.groupby(axis=1, level=0).get_group(0).columns)
#MultiIndex(levels=[[0, 1, 2], ['A', 'B', 'C', 'D', 'E', 'G', 'H', 'I', 'J', 'L', 'M', 'N', 'P']],
#           codes=[[0, 0, 0, 0, 0], [0, 1, 2, 3, 4]])
3 голосов
/ 03 мая 2019

Я буду использовать get_level_values, поскольку levels сохранит все категории исходных столбцов данных

result.groupby(axis=1, level=0).get_group(0).columns.get_level_values(1)
Out[1296]: Index(['A', 'B', 'C', 'D', 'E'], dtype='object')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...