Python中如何根据条件交换DataFrame两列的值?
问题分析与解决
错误原因
使用apply(axis=1)遍历行时,传入自定义函数的是单条行记录(Series类型),而非整个DataFrame。函数里的df['unit_backup']实际是单个字符串值,不是Series对象,而.str是Series专属的字符串操作访问器,因此触发'str' object has no attribute 'str'错误。
解决方案
方案1:修改函数适配单条行记录
调整函数逻辑,直接处理每行的Series数据,无需创建备份列:
def range_unit_correction_fn(row): if "-" in row['Unit']: # 直接交换两列值 row['Range'], row['Unit'] = row['Unit'], row['Range'] return row # 应用函数 sample_df = sample_df.apply(range_unit_correction_fn, axis=1)
执行后得到目标结果:
Range Unit 0 34-67 ml 1 35-50 12 2 10-100 gm 3 45-90 mg
方案2:向量化批量处理(推荐)
避免低效的行迭代,用布尔索引批量操作,适合大数据量场景:
# 生成需要交换的行的掩码 mask = sample_df['Unit'].str.contains("-", na=False) # 批量交换满足条件的行的Range和Unit列 sample_df.loc[mask, ['Range', 'Unit']] = sample_df.loc[mask, ['Unit', 'Range']].values
内容的提问来源于stack exchange,提问作者ViSa
相关产品推荐
相关产品推荐

