Python-Polars:group_by 列将剩余列组合成结构体字段?

问题描述 投票:0回答:1

我还没有找到一种方法来对列进行 group_by() 并为新列提供一个结构字段。这是数据帧的片段:

人口普查_小册子 GEOID_人口普查 表_B24012 价值
人口普查表 9… 04001942600 B24012_001E 32179.0
人口普查表 9… 04001942700 B24012_001E 33483.0
人口普查表 9… 04001944000 B24012_001E 33114.0
人口普查表 9… 04001944100 B24012_001E 26993.0
人口普查表 9… 04001944201 B24012_001E 33798.0
... ... ... ...
人口普查数据 2… 56043000200 B24012_073E -6.6667e8
人口普查数据 3… 56043000301 B24012_073E -6.6667e8
人口普查数据 3… 56043000302 B24012_073E -6.6667e8
人口普查表 9… 56045951100 B24012_073E 41042.0
人口普查表 9… 56045951300 B24012_073E -6.6667e8

本质上我想做的是按

Census_Tract
GEOID_Census
进行分组。列 table_B24012 和 value 应合并为一列。

换句话说,我希望数据成为一个结构对象,这样对于每个 GEOID_Census 我都有一行值,并且可能在新列中内置字典结构。它看起来像这样

人口普查_小册子 GEOID_人口普查 表_B24012
人口普查表 9… 04001942600 {“B24012_001E”:32179.0,“B24012_002E”:...,...}
人口普查表 9… 04001942700 {“B24012_001E”:33483.0,“B24012_002E”:...,...}
人口普查表 9… 04001944000 {“B24012_001E”:33114.0,“B24012_002E”:...,...}
人口普查表 9… 04001944100 {“B24012_001E”:26993.0,“B24012_002E”:...,...}
人口普查表 9… 04001944201 {“B24012_001E”:33798.0,“B24012_002E”:...,...}

如果有更有效的方式将其存储在列中,我愿意接受其他方式。我只是想浓缩信息。

我尝试将两列转换为列表,然后转换为结构,以及字典。没有任何帮助。有任何想法吗?预先感谢!

python dataframe dictionary struct python-polars
1个回答
0
投票

要使用 Polars 解决此问题,您可以使用

groupby()
agg()
函数以及
pl.col()
将剩余的列组合成一个结构体。这是一个例子:

import polars as pl

df = pl.DataFrame({
    'id': [1, 1, 2, 2, 3, 3],
    'col1': ['a', 'b', 'c', 'd', 'e', 'f'],
    'col2': [1, 2, 3, 4, 5, 6],
    'col3': [True, False, True, False, True, False]
})

result = df.groupby('id').agg(
    pl.struct(
        [
            pl.col(col).alias(col) 
            for col in df.columns if col != 'id'
        ]
    ).alias('combined')
)

print(result)

输出:

shape: (3, 2)
┌─────┬───────────────────────────────────────────────────┐
│ id  ┆ combined                                          │
│ --- ┆ ---                                               │
│ i64 ┆ struct[3]{'col1': str, 'col2': i64, 'col3': bool} │
╞═════╪═══════════════════════════════════════════════════╡
│ 1   ┆ {"col1": ["a", "b"], "col2": [1, 2], "col3": [tru │
│     ┆ e, false]}                                        │
├╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌-╌┤
│ 2   ┆ {"col1": ["c", "d"], "col2": [3, 4], "col3": [tru │
│     ┆ e, false]}                                        │
├╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌-╌┤
│ 3   ┆ {"col1": ["e", "f"], "col2": [5, 6], "col3": [tru │
│     ┆ e, false]}                                        │
└─────┴───────────────────────────────────────────────────┘

说明:

  1. 我们使用
    groupby('id')
    按“id”列对 DataFrame 进行分组。
  2. agg()
    内部,我们使用
    pl.struct()
    创建一个组合其余列的结构列。
  3. 我们使用列表理解迭代 DataFrame 的列,不包括“id”列。
  4. 对于每一列,我们使用
    pl.col(col).alias(col)
    将列以其原始名称包含在结构中。
  5. 最后,我们使用
    .alias('combined')
    将结构列别名为“组合”。

生成的 DataFrame 有两列:“id”和“combined”。 “combined”列是一个结构体,其中包含每组“id”的剩余列(“col1”、“col2”、“col3”)。

© www.soinside.com 2019 - 2024. All rights reserved.