У меня есть DataFrame, который имеет несколько уровней столбцов: уровень 0 — «мета» и «rna», а уровень 1 — «subject_id», «болезнь», «время» и «статус» в разделе «мета» и многие тысячи EnsemblGeneID. под «РНК». На мой взгляд, если бы мне нужно было определенное подмножество «мета» столбцов и все мои столбцы «rna», я бы просто передал список кортежей в df.loc[]:
Код: Выделить всё
selected_columns = df.loc[:, [("meta", "subject_id"), ("meta", "status"), ("rna",:)]]Я пробовал различные методы передачи данных в df.loc[], чтобы поэкспериментировать, но большинство из них заканчивалось ошибкой различные ключевые ошибки, ошибки нарезки и т. д., и то, что мне удавалось заставить работать, было далеко не так элегантно, как могло бы быть. Все еще пытаюсь выяснить, могу ли я использовать индексаторы, но это кажется слишком сложным по сравнению с одноуровневым dfs.
Ближе всего, что я нашел, что это сработало, было предложено ChatGPT:
Код: Выделить всё
selected_columns = df.loc[:, [('meta', 'subject_id'), ('meta', 'status')] + [('rna', col) for col in df['rna'].columns]]Изменить:
Пока я остановился на выборе selected_columns = pd.IndexSlice[ . . . ] нужных мне столбцов, если мне нужны сложные подмножества столбцов «мета» или «rna», что похоже на ответ, приведенный ниже, и ChatGPT. Похоже, что pandas требуется точная индексация столбцов кортежа, которая должна быть определена «во время компиляции». Создание срезов индекса не является идеальным, но пока кажется, что это работает нормально.
Что касается любого, кто в будущем захочет помочь, он представляет более широкую картину того, чего я пытаюсь достичь с помощью этот пример таблицы (невозможно отформатировать ее с помощью многоуровневых заголовков):
| мета-------------------------------------------| rna
< th>subject_id
время
образец
ген1
ген2
. . .
gene1000
0xA
00
1
0,001
< td>0,002
. . .
0,004
0xB
04
2
0,002
0,003
. . .
0,005
. . .
. . .
. . .
. . .
. . .
. . .
. . .
0xFF
74
100
0,100
0,101
. . .
0.102
Я бы хотел легко смешивать и сопоставлять столбцы, имея при этом возможность ссылаться на большие фрагменты столбцов. Например, создайте новый df, df_new из столбцов subject_id и time и включите гены 300–400 или гены 0–400 примерно так:
Код: Выделить всё
df_new = df.loc[:, [("meta", "subject_id"), ("meta", "time"), ("rna", :"gene401")]]пример таблицы Excel, так как я не могу создавать многоуровневые заголовки при переполнении стека
Подробнее здесь: https://stackoverflow.com/questions/788 ... -using-loc