Я пытаюсь изменить порядок столбцов в фрейме данных Polars и сначала поместить 5 столбцов из 100 (к сожалению, документ должен быть читабелен в Excel). Кажется, я не могу найти простой способ сделать это.
В идеале мне бы хотелось что-то простое, например
df.select(
'col2',
'col1',
r'^.*$', # the rest of the columns, but this throws a duplicate column name error
)
Отрицательный просмотр вперед не поддерживается, поэтому невозможно создать регулярное выражение, исключающее выбранные мной столбцы. Я мог бы сделать два перекрывающихся выделения, удалить столбцы из одного выделения, а затем соединить их, но, похоже, это не тот способ сделать это. Любое другое решение, которое я нашел, предполагает явное присвоение имени каждому отдельному столбцу, чего я стараюсь избегать, поскольку столбцы довольно часто добавляются или меняют имена.
Он предполагает двойное именование столбцов, но вы можете их исключить:
df.select('col2', 'col1', pl.exclude('col1', 'col2'))
Вы можете сохранить имена в переменной, чтобы избежать дублирования.
df = pl.DataFrame(schema=list('abcdefg'))
cols = 'g', 'e'
df.select(*cols, pl.exclude(cols))
shape: (0, 7)
┌──────┬──────┬──────┬──────┬──────┬──────┬──────┐
│ g ┆ e ┆ a ┆ b ┆ c ┆ d ┆ f │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ null ┆ null ┆ null ┆ null ┆ null ┆ null ┆ null │
╞══════╪══════╪══════╪══════╪══════╪══════╪══════╡
└──────┴──────┴──────┴──────┴──────┴──────┴──────┘
Существует открытый запрос функции, позволяющий разрешить df.select('col2', 'col1', ...)
Можно совместить pl.exclude
с оператором морж.
Предположим, у вас есть что-то вроде
df=pl.DataFrame(
[
pl.Series('c', [1, 2, 3], dtype=pl.Int64),
pl.Series('b', [2, 3, 4], dtype=pl.Int64),
pl.Series('fcvem', [4, 5, 6], dtype=pl.Int64),
pl.Series('msoy', [4, 5, 6], dtype=pl.Int64),
pl.Series('smrn', [4, 5, 6], dtype=pl.Int64),
pl.Series('z', [4, 5, 6], dtype=pl.Int64),
pl.Series('wxous', [4, 5, 6], dtype=pl.Int64),
pl.Series('uusn', [4, 5, 6], dtype=pl.Int64),
pl.Series('ydj', [4, 5, 6], dtype=pl.Int64),
pl.Series('squr', [4, 5, 6], dtype=pl.Int64),
pl.Series('yyx', [4, 5, 6], dtype=pl.Int64),
pl.Series('nl', [4, 5, 6], dtype=pl.Int64),
pl.Series('a', [0, 1, 2], dtype=pl.Int64),
]
)
и вы хотите, чтобы первые три столбца были «a», «b», «c». Вы можете сделать:
df.select(*(start_cols:=['a','b','c']), pl.exclude(start_cols))
Это создает список с именем start_cols
, который содержит «a», «b», «c». Звездочка разворачивает список, а затем pl.exclude
использует содержимое start_cols
, чтобы указать полярам вернуть все, кроме start_cols
.
Если хотите, вместо этого вы можете использовать следующий синтаксис:
df.select((start_cols:=['a','b','c'])+ [pl.exclude(start_cols)])
Спасибо! Это очень похоже на то, что я сделал с помощью @jqurious: просто сделал отдельный список COLUMNS = ['col2', 'col1'] df = df.select(pl.col(COLUMNS), pl .exclude(COLUMNS)) Хотя ваше решение более элегантно, мне полезно иметь этот список в другом месте.