python Polars -根据表达式按列名分组获取特定列

xpcnnkqh  于 2023-03-16  发布在  Python
关注(0)|答案(1)|浏览(222)

我的df为:

position    1164_1164.0 1164_1164.1 yes_001.0   yes_001.1   10316.0 10316.1 10349.0 10349.1 10418.0 10418.1
4414    0   1   0   0   1   0   0   0   1   1
5295    0   1   0   0   1   0   0   0   1   1
5738    0   1   0   0   1   0   0   0   1   1
5785    0   1   0   0   1   0   0   0   1   1
6392    0   1   0   0   1   0   0   0   1   1
7727    1   1   0   0   1   0   0   0   1   1
8876    1   1   0   0   1   0   0   0   1   1
9018    1   1   0   0   1   0   0   0   1   1
9208    1   1   0   0   1   0   1   0   1   1
9627    1   1   0   0   1   0   1   0   1   0

正如您在第二列中看到的,我们有由后缀.0和.1分隔的列名对
在Pandas中,我可以通过排除第一列来进行分组,通过一个表达式来捕获列名中“.”之前的列名,如下所示:

g = df.iloc[:,1:].groupby(df.columns[1:].str.extract(r'(\w+)\.', expand=False), axis=1)

我正试图对极地做同样的事情,但我所能得到的就是这么远:

g = df[:,1:].groupby(df.columns[1:])

现在,我尝试了str.extract(r'(\w+)\.',但它给出了一个错误:

AttributeError: 'list' object has no attribute 'str'

编辑:
我能够得出这个,但它仍然给我一个错误,当我尝试一些计算:

g = df[:,1:].groupby(pl.col("*").str.extract(r'(\w+)\.'))

当我试着:

s = g.sum()

我得到:

DuplicateError: column with name '1164_1164.0' has more than one occurrences
cmssoen2

cmssoen21#

如果你提供一个代码中的例子会很有帮助。
第一点要注意的是:

  • df.columns在polars中并不特殊-它只是一个python列表。

主要问题是数据的形状不适合极线。
这样做的原因是polars与类型一起工作:

  • 列具有单一类型-这是有保证的
  • “横向”引入多种可能类型

可以使用.melt将数据整形为单列

(df
 .with_row_count()
 .melt(id_vars=("row_nr", "position"), variable_name="column")
 .with_columns(prefix = pl.col("column").str.replace(r"[.][^.]+$", "")))
shape: (20, 5)
┌────────┬──────────┬─────────────┬───────┬───────────┐
│ row_nr | position | column      | value | prefix    │
│ ---    | ---      | ---         | ---   | ---       │
│ u32    | i64      | str         | i64   | str       │
╞════════╪══════════╪═════════════╪═══════╪═══════════╡
│ 0      | 1        | 1164_1164.0 | 1     | 1164_1164 │
│ 1      | 2        | 1164_1164.0 | 2     | 1164_1164 │
│ 0      | 1        | 1164_1164.1 | 1     | 1164_1164 │
│ 1      | 2        | 1164_1164.1 | 2     | 1164_1164 │
│ ...    | ...      | ...         | ...   | ...       │
│ 0      | 1        | 10418.0     | 1     | 10418     │
│ 1      | 2        | 10418.0     | 2     | 10418     │
│ 0      | 1        | 10418.1     | 1     | 10418     │
│ 1      | 2        | 10418.1     | 2     | 10418     │
└────────┴──────────┴─────────────┴───────┴───────────┘

然后您可以.groupby
一个二个一个一个
要从 “长到宽” -您可以.pivot

(df
 .with_row_count().melt(id_vars=("row_nr", "position"), variable_name="column")
 .with_columns(prefix = pl.col("column").str.replace(r"[.][^.]+$", ""))
 .groupby("row_nr", "prefix", maintain_order=True)
 .agg(
    pl.col("column"), 
    pl.first("position"), 
    pl.col("value").sum())
 .explode(pl.col("column"))
 .pivot(
   index=("row_nr", "position"), 
   columns="column", 
   values="value")
)
shape: (2, 12)
┌────────┬──────────┬─────────────┬─────────────┬─────┬─────────┬─────────┬─────────┬─────────┐
│ row_nr | position | 1164_1164.0 | 1164_1164.1 | ... | 10349.0 | 10349.1 | 10418.0 | 10418.1 │
│ ---    | ---      | ---         | ---         |     | ---     | ---     | ---     | ---     │
│ u32    | i64      | i64         | i64         |     | i64     | i64     | i64     | i64     │
╞════════╪══════════╪═════════════╪═════════════╪═════╪═════════╪═════════╪═════════╪═════════╡
│ 0      | 1        | 2           | 2           | ... | 2       | 2       | 2       | 2       │
│ 1      | 2        | 4           | 4           | ... | 4       | 4       | 4       | 4       │
└────────┴──────────┴─────────────┴─────────────┴─────┴─────────┴─────────┴─────────┴─────────┘

maintain_order=True添加到.groupby以保持行顺序
使用的 Dataframe :

schema = ["position"] + """
1164_1164.0 1164_1164.1 yes_001.0   yes_001.1   
10316.0 10316.1 10349.0 10349.1 10418.0 10418.1
""".split()

df = pl.DataFrame([[1] * len(schema)] + [[2] * len(schema)], schema=schema)
shape: (2, 11)
┌──────────┬─────────────┬─────────────┬───────────┬─────┬─────────┬─────────┬─────────┬─────────┐
│ position | 1164_1164.0 | 1164_1164.1 | yes_001.0 | ... | 10349.0 | 10349.1 | 10418.0 | 10418.1 │
│ ---      | ---         | ---         | ---       |     | ---     | ---     | ---     | ---     │
│ i64      | i64         | i64         | i64       |     | i64     | i64     | i64     | i64     │
╞══════════╪═════════════╪═════════════╪═══════════╪═════╪═════════╪═════════╪═════════╪═════════╡
│ 1        | 1           | 1           | 1         | ... | 1       | 1       | 1       | 1       │
│ 2        | 2           | 2           | 2         | ... | 2       | 2       | 2       | 2       │
└──────────┴─────────────┴─────────────┴───────────┴─────┴─────────┴─────────┴─────────┴─────────┘

相关问题