Polars Python中按条件重命名列报错,如何解决?
问题分析与解决方案
错误原因
你遇到的TypeError是因为**pl.when生成的是Polars表达式(Expr对象),而rename方法要求新列名必须是字符串类型**。pl.when用于处理DataFrame内部的列数据逻辑,而这里的条件判断是基于函数传入的Python参数status_filter_value,属于Python层面的变量,不需要用Polars表达式来处理。
解决方案
直接用Python原生的条件判断或字典映射生成目标列名字符串,再传给rename即可。以下是两种可行的实现方式:
方式1:Python原生条件判断
def Age_filter(status_filter_value = 1): # 通过Python条件判断生成对应列名 new_col_name = ( '30_DPD_MOB' if status_filter_value == 1 else '60_DPD_MOB' if status_filter_value == 2 else '90_DPD_MOB' if status_filter_value == 3 else '120_DPD_MOB' ) return ( test_df .filter(pl.col('Status') == status_filter_value) .sort(['Id','Age']) .groupby('Id') .agg(pl.col('Age').first()) .sort('Id') .rename({'Age': new_col_name}) ) # 测试调用 Age_filter()
方式2:字典映射(更简洁易维护)
如果后续需要扩展更多status值,用字典映射会更方便:
def Age_filter(status_filter_value = 1): # 定义status与目标列名的映射关系 status_col_map = { 1: '30_DPD_MOB', 2: '60_DPD_MOB', 3: '90_DPD_MOB' } # 获取对应列名,默认返回'120_DPD_MOB' new_col_name = status_col_map.get(status_filter_value, '120_DPD_MOB') return ( test_df .filter(pl.col('Status') == status_filter_value) .sort(['Id','Age']) .groupby('Id') .agg(pl.col('Age').first()) .sort('Id') .rename({'Age': new_col_name}) ) # 测试调用 Age_filter()
为什么之前的代码不生效
你两次尝试都误用了pl.when:这个方法是用来构建DataFrame列的计算逻辑(比如根据某列的值动态生成另一列数据),但这里的条件是Python函数的参数变量,直接用Python自身的判断逻辑就能得到字符串类型的列名,完全不需要Polars表达式介入。
内容的提问来源于stack exchange,提问作者ViSa
相关产品推荐
相关产品推荐

