如何在Python Polars中对两列列表执行zip操作?
解决方案
方法1:生成配对后的列表列
直接用Polars内置的arr.zip()方法,对B、C列按位置配对生成元组列表列,同时保留原A列数据:
import polars as pl df = pl.DataFrame({ 'A': ['t', 'u', 'v'], 'B': [['a', 'v', 'x'], ['f', 'g', 'h'], ['p', 'o', 'i']], 'C': [[11, 12, 14], [41, 42, 43], [66, 77, 88]] }) result = df.with_columns( paired=pl.col("B").arr.zip(pl.col("C")) ) print(result)
输出结果:
shape: (3, 4) ┌─────┬─────────────┬─────────────┬─────────────────────────────┐ │ A ┆ B ┆ C ┆ paired │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ list[str] ┆ list[i64] ┆ list[tuple[str, i64]] │ ╞═════╪═════════════╪═════════════╪═════════════════════════════╡ │ t ┆ ["a", "v",… ┆ [11, 12, 14] ┆ [("a", 11), ("v", 12), ("x… │ │ u ┆ ["f", "g",… ┆ [41, 42, 43] ┆ [("f", 41), ("g", 42), ("h… │ │ v ┆ ["p", "o",… ┆ [66, 77, 88] ┆ [("p", 66), ("o", 77), ("i… │ └─────┴─────────────┴─────────────┴─────────────────────────────┘
方法2:展开为单行配对记录
如果需要把每个配对拆成单独一行,同时保留A列对应值,只需在生成配对列后调用explode()即可——Polars会自动将A列值复制到对应行,完全不会出现关联错误:
result = df.with_columns( paired=pl.col("B").arr.zip(pl.col("C")) ).explode("paired") # 可选:将配对元组拆分为单独列 result = result.with_columns( B_val=pl.col("paired").list.get(0), C_val=pl.col("paired").list.get(1) ).drop("paired") print(result)
输出结果:
shape: (9, 4) ┌─────┬─────────────┬─────────────┬───────┬───────┐ │ A ┆ B ┆ C ┆ B_val ┆ C_val │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ list[str] ┆ list[i64] ┆ str ┆ i64 │ ╞═════╪═════════════╪═════════════╪═══════╪═══════╡ │ t ┆ ["a", "v",… ┆ [11, 12, 14] ┆ a ┆ 11 │ │ t ┆ ["a", "v",… ┆ [11, 12, 14] ┆ v ┆ 12 │ │ t ┆ ["a", "v",… ┆ [11, 12, 14] ┆ x ┆ 14 │ │ u ┆ ["f", "g",… ┆ [41, 42, 43] ┆ f ┆ 41 │ │ u ┆ ["f", "g",… ┆ [41, 42, 43] ┆ g ┆ 42 │ │ u ┆ ["f", "g",… ┆ [41, 42, 43] ┆ h ┆ 43 │ │ v ┆ ["p", "o",… ┆ [66, 77, 88] ┆ p ┆ 66 │ │ v ┆ ["p", "o",… ┆ [66, 77, 88] ┆ o ┆ 77 │ │ v ┆ ["p", "o",… ┆ [66, 77, 88] ┆ i ┆ 88 │ └─────┴─────────────┴─────────────┴───────┴───────┘
优势说明
arr.zip()是Polars底层优化的向量化操作,比Python原生zip()循环处理快得多,适合大数据量场景;explode()也是内置对齐逻辑,完全不用手动处理A列的关联问题。
内容的提问来源于stack exchange,提问作者Arthur Julião
相关产品推荐
相关产品推荐

