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

如何在polars中将两列组合成“{key:value}”对?

  •  1
  • Dante  · 技术社区  · 1 年前

    我在和一个 Polars DataFrame ,我想将两列组合成字典格式,其中一列中的值成为键,另一列的值成为相应的值。

    以下是一个DataFrame示例:

    import polars as pl
    
    df = pl.DataFrame({
        "name": ["Chuck", "John", "Alice"],
        "surname": ["Dalliston", "Doe", "Smith"]
    })
    

    我想将这个DataFrame转换为一个包含字典的新列,其中name是键,姓氏是值。预期结果应该是这样的:

    shape: (3, 3)
    ┌───────┬─────────┬──────────────────────────┐
    │ name  │ surname │ name_surname             │
    │ ---   │ ---     │ ---                      │
    │ str   │ str     │ dict[str, str]           │
    ├───────┼─────────┼──────────────────────────┤
    │ Chuck │ Dalliston│ {"Chuck": "Dalliston"}   │
    │ John  │ Doe     │ {"John": "Doe"}          │
    │ Alice │ Smith   │ {"Alice": "Smith"}       │
    └───────┴─────────┴──────────────────────────┘
    

    我尝试了以下代码:

    df.with_columns(
        json = pl.struct("name", "surname").map_elements(json.dumps)
    )
    

    但结果并不像预期的那样。而不是创建一个字典 key-value ,它产生:

    {name:Chuck,surname:Dalliston}
    
    2 回复  |  直到 1 年前
        1
  •  1
  •   Derek Roberts    1 年前

    你可以试试这个代码片段,这似乎是你能得到的最接近pl的格言。

    参见参考文献: data_types_polaris

    import polars as pl
    
    df = pl.DataFrame(
        {"name": ["Chuck", "John", "Alice"], "surname": ["Dalliston", "Doe", "Smith"]}
    )
    
    df = df.select(
        [
            "name",
            "surname",
            (
                pl.struct(["name", "surname"]).map_elements(
                    lambda row: {row["name"]: row["surname"]}, return_dtype=pl.Object
                )
            ).alias("name_surname"),
        ]
    )
    print(df)
    
    ┌───────┬───────────┬────────────────────────┐
    │ name  ┆ surname   ┆ name_surname           │
    │ ---   ┆ ---       ┆ ---                    │
    │ str   ┆ str       ┆ object                 │
    ╞═══════╪═══════════╪════════════════════════╡
    │ Chuck ┆ Dalliston ┆ {'Chuck': 'Dalliston'} │
    │ John  ┆ Doe       ┆ {'John': 'Doe'}        │
    │ Alice ┆ Smith     ┆ {'Alice': 'Smith'}     │
    └───────┴───────────┴────────────────────────┘
    
        2
  •  0
  •   Dante    1 年前
    import polars as pl
    
    df = pl.DataFrame(
        {"name": ["Chuck", "John", "Alice"], "surname": ["Dalliston", "Doe", "Smith"]}
    )
    df = df.with_columns(
                json=pl.concat_str(
                    pl.lit("{"),
                    pl.col("specification_name"),
                    pl.lit(":"),
                    pl.col("specification_value"),
                    pl.lit("}"),
                    separator='"',
                )
            )
    

    这将返回一个json字符串