Polars中explode列表列时出现列长度不匹配如何解决?
解决Polars中explode列表列时的长度不匹配问题
问题
我有一个包含列表列(list)和另外两列(a、b)的表格,想要拆分列表列的同时保留另外两列的值。比如一行数据是a='q'、b='p'、list=['hello','bye'],期望拆分成两行,a、b值不变,list分别为'hello'和'bye'。但用pl.select(pl.exclude("list"), pl.col("list").explode())时出现长度不匹配错误,该怎么解决?
解决方案
不要在select()里单独处理列表列,直接调用DataFrame的explode()方法即可,它会自动复制其他列的值来匹配拆分后的列表列长度:
示例代码
import polars as pl # 创建测试DataFrame df = pl.DataFrame({ "a": ["q"], "b": ["p"], "list": [["hello", "bye"]] }) # 执行explode操作 exploded_df = df.explode("list") print(exploded_df)
输出结果
shape: (2, 3) ┌─────┬─────┬───────┐ │ a ┆ b ┆ list │ │ --- ┆ --- ┆ --- │ │ str ┆ str ┆ str │ ╞═════╪═════╪═══════╡ │ q ┆ p ┆ hello │ │ q ┆ p ┆ bye │ └─────┴─────┴───────┘
错误原因
pl.select()的作用是选择/转换列,单独对list列explode()后,它的长度变为2,而pl.exclude("list")选中的a、b列长度还是1,Polars不允许列长度不一致,所以抛出错误。而df.explode()是Polars专门设计的列表拆分方法,会自动处理其他列的复制逻辑,确保所有列长度一致。
如果需要拆分多个列表列,直接传入列名列表即可:df.explode(["list_col1", "list_col2"])
内容的提问来源于stack exchange,提问作者linus heinz
相关产品推荐
相关产品推荐

