代码之家  ›  专栏  ›  技术社区  ›  crazydragon777

是否有一种有效的方法将python polars-select中所有剩余的未选中列都包含在内?

  •  5
  • crazydragon777  · 技术社区  · 1 年前

    我试图重新排序Polars数据框中的列,并将100列中的5列放在第一位(不幸的是,该文档在excel中必须具有一定的可读性)。我似乎找不到一个简单的方法来做这件事。

    理想情况下,我喜欢简单的东西,比如

    df.select(
        'col2',
        'col1',
        r'^.*$',  # the rest of the columns, but this throws a duplicate column name error
    )
    

    不支持负前瞻,因此无法创建排除所选列的正则表达式。我可以做两个重叠的选择,从一个选择中删除列,然后将它们连接起来,但这似乎不是预期的方式。我发现的每一个其他解决方案都涉及显式命名每一列,我试图避免这种情况,因为这些列经常被添加或更改名称。

    2 回复  |  直到 1 年前
        1
  •  4
  •   jqurious FObersteiner    1 年前

    它涉及两次命名列,但您可以排除它们:

    df.select('col2', 'col1', pl.exclude('col1', 'col2'))
    

    例子:

    df = pl.DataFrame(schema=list('abcdefg'))
    
    df.select('g', 'e', pl.exclude('e', 'g'))
    
    shape: (0, 7)
    ┌──────┬──────┬──────┬──────┬──────┬──────┬──────┐
    │ g    ┆ e    ┆ a    ┆ b    ┆ c    ┆ d    ┆ f    │
    │ ---  ┆ ---  ┆ ---  ┆ ---  ┆ ---  ┆ ---  ┆ ---  │
    │ null ┆ null ┆ null ┆ null ┆ null ┆ null ┆ null │
    ╞══════╪══════╪══════╪══════╪══════╪══════╪══════╡
    └──────┴──────┴──────┴──────┴──────┴──────┴──────┘
    

    有一个功能请求需要允许 df.select('col2', 'col1', ...)

        2
  •  2
  •   Dean MacGregor    1 年前

    你可以合并 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),
        ]
    )
    

    您希望前3列是“a”、“b”、“c”。您可以执行以下操作:

    df.select(*(start_cols:=['a','b','c']), pl.exclude(start_cols))
    

    这将创建一个名为的列表 start_cols 其中包含“a”、“b”、“c”。星号打开列表,然后 请排除 使用以下内容 start_cols 告诉波兰人归还所有东西,除了 start_cols .

    如果你愿意,你可以改为使用以下语法:

    df.select((start_cols:=['a','b','c'])+ [pl.exclude(start_cols)])