我还没有找到一种方法来对列进行 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”:...,...} |
如果有更有效的方式将其存储在列中,我愿意接受其他方式。我只是想浓缩信息。
我尝试将两列转换为列表,然后转换为结构,以及字典。没有任何帮助。有任何想法吗?预先感谢!
要使用 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]} │
└─────┴───────────────────────────────────────────────────┘
说明:
groupby('id')
按“id”列对 DataFrame 进行分组。agg()
内部,我们使用pl.struct()
创建一个组合其余列的结构列。pl.col(col).alias(col)
将列以其原始名称包含在结构中。.alias('combined')
将结构列别名为“组合”。生成的 DataFrame 有两列:“id”和“combined”。 “combined”列是一个结构体,其中包含每组“id”的剩余列(“col1”、“col2”、“col3”)。