如何用Polars更优雅地从列表向现有DataFrame添加空列?
问题
我希望将列表中的元素作为列名,向现有的Polars DataFrame添加新的空列。目前我通过以下代码实现:
import polars as pl df = pl.DataFrame({'a': [1,2,3]}) mylist = [f'col{i}' for i in range(1,4)] data = [[''] for i in range(1,len(mylist)+1)] df.join(pl.DataFrame(data=data,schema=mylist), how='cross')
但有没有更具Polars风格的实现方式?比如使用.with_columns()或pl.any()?这样就无需创建新DataFrame并进行关联操作。
更具Polars风格的实现方式
直接用.with_columns()结合pl.lit()就能高效完成需求,完全不需要创建临时DataFrame做交叉连接,这是Polars推荐的原生写法:
方式1:添加空字符串列
遍历列名列表,为每个列名生成空字符串列:
import polars as pl df = pl.DataFrame({'a': [1,2,3]}) mylist = [f'col{i}' for i in range(1,4)] df = df.with_columns([pl.lit("").alias(col) for col in mylist])
方式2:添加空值(None)列
如果需要的是None类型的空列(而非空字符串),可以指定数据类型:
df = df.with_columns([pl.lit(None, dtype=pl.String).alias(col) for col in mylist])
方式3:批量添加同类型空列
如果所有新列都是同一数据类型,也可以用pl.select()配合pl.all()保留原有列,再批量生成新列:
df = df.select( pl.all(), *[pl.lit("").alias(col) for col in mylist] )
这些写法更贴合Polars的API设计,代码更简洁,性能也远优于交叉连接——交叉连接会额外创建临时DataFrame,而直接用with_columns()是在原DataFrame基础上直接扩展列,效率更高。
内容的提问来源于stack exchange,提问作者lmocsi
相关产品推荐
相关产品推荐

