Python Polars:如何修改DataFrame中Series的每隔n个元素?
Polars DataFrame 修改指定Series中每隔n个元素的方法
在Polars中直接使用df["a", 1::2] *= -1这种索引赋值会报错,因为Polars DataFrame的__setitem__不支持这种列+切片的组合赋值语法。以下是几种可行的解决方法:
方法1:通过行号条件判断(推荐,符合Polars表达式风格)
利用Polars的表达式系统,通过行号筛选目标位置并修改:
import polars as pl df = pl.DataFrame(pl.Series("a", [1, -1, 1, -1, 1])) # 修改从索引1开始、步长为2的元素(即第2、4个元素,索引从0开始) df = df.with_columns( pl.when(pl.int_range(0, pl.count()) % 2 == 1) .then(pl.col("a") * -1) .otherwise(pl.col("a")) .alias("a") ) print(df) # 输出结果: # shape: (5, 1) # ┌─────┐ # │ a │ # │ --- │ # │ i64 │ # ╞═════╡ # │ 1 │ # │ 1 │ # │ 1 │ # │ 1 │ # │ 1 │ # └─────┘
说明:pl.int_range(0, pl.count())生成与数据行数一致的行号序列,通过% 2 == 1筛选出每隔2个的目标行,对这些行的元素执行乘-1操作,其余行保留原数值。
方法2:修改Series后替换列
先提取目标Series,对Series做切片修改,再将修改后的Series放回DataFrame:
import polars as pl df = pl.DataFrame(pl.Series("a", [1, -1, 1, -1, 1])) # 提取Series并修改指定切片 s = df["a"] s[1::2] *= -1 # 替换原列 df = df.with_columns(s.alias("a"))
说明:Polars的Series支持切片索引修改,因此可以先单独处理Series,再更新回DataFrame。
方法3:原地修改(适合需要复用原DataFrame对象的场景)
如果需要原地修改DataFrame,可以使用update方法结合表达式定位目标行:
import polars as pl df = pl.DataFrame(pl.Series("a", [1, -1, 1, -1, 1])) # 原地修改目标位置的元素 df.update( pl.col("a") * -1, filter=pl.int_range(0, pl.count()) % 2 == 1 )
说明:update方法的filter参数用于指定要修改的行,仅满足条件的行会被更新。
内容的提问来源于stack exchange,提问作者FObersteiner
相关产品推荐
相关产品推荐

