我有以下数据框:
import polars as pl
import numpy as np
df = pl.DataFrame(
{
"nrs": [1, 2, 3, None, 5],
"names_A0": ["foo", "ham", "spam", "egg", None],
"random_A0": np.random.rand(5),
"A_A2": [True, True, False, False, False],
}
)
digit=0
对于名称以字符串
suf =f'_A{digit}'
结尾的每个列 X,我想向 df
添加一个相同的列,其名称与 X 相同,但没有 suf
。在此示例中,我需要将列 names
和 random
添加到原始数据框 df
,其内容分别与列 names_A0
和 random_A0
相同。
您可以使用 Polars 的 列选择器 选择相应的列,然后使用
.name.map
重命名选择器表达式的输出。
import polars.selectors as cs
df.with_columns(cs.matches("_A\d$").name.map(lambda name: name[:-3]))
shape: (5, 7)
┌──────┬──────────┬───────────┬───────┬───────┬──────────┬───────┐
│ nrs ┆ names_A0 ┆ random_A0 ┆ A_A2 ┆ names ┆ random ┆ A │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ str ┆ f64 ┆ bool ┆ str ┆ f64 ┆ bool │
╞══════╪══════════╪═══════════╪═══════╪═══════╪══════════╪═══════╡
│ 1 ┆ foo ┆ 0.314699 ┆ true ┆ foo ┆ 0.314699 ┆ true │
│ 2 ┆ ham ┆ 0.594001 ┆ true ┆ ham ┆ 0.594001 ┆ true │
│ 3 ┆ spam ┆ 0.276783 ┆ false ┆ spam ┆ 0.276783 ┆ false │
│ null ┆ egg ┆ 0.869385 ┆ false ┆ egg ┆ 0.869385 ┆ false │
│ 5 ┆ null ┆ 0.955341 ┆ false ┆ null ┆ 0.955341 ┆ false │
└──────┴──────────┴───────────┴───────┴───────┴──────────┴───────┘
注意。 在上面的示例中,我们可以选择名称包含
_A
后跟单个数字 (\d
) 后跟字符串结尾 ($
) 的所有列。由于后缀保证长度为 3,因此新名称等于原始名称,去掉最后 3 个字母。