如何将pandas DataFrame中大于1的数值替换为1,0保持不变
问题原因
- 你调用
df.apply(find_value, axis=1)时,传入find_value的参数是整行的Series对象,而非单个单元格的值,int(x)执行报错后会进入except分支直接返回原行数据,因此DataFrame没有任何变化。 - 你编写的
find_value逻辑不符合需求:原有等于1的数值会被误修改为0,不符合“仅将大于1的数值改为1、0保持不变”的要求。
解决方案
方案1:向量化操作(推荐,性能远高于apply类遍历方法)
直接筛选数值列做批量替换,代码简洁效率高:
import pandas as pd # 示例DataFrame df = pd.DataFrame([ ['Manila', 5,12,0], ['NY',9,0,14], ['Berlin',8,10,6] ], columns = ['a','b','c','d']) # 筛选所有数值类型的列 num_cols = df.select_dtypes(include='number').columns # 大于1的数值裁剪为1,其余值保持不变 df[num_cols] = df[num_cols].clip(upper=1)
如果需要更灵活的判断条件,也可以用where写法实现同样效果:
df[num_cols] = df[num_cols].where(df[num_cols] <= 1, 1)
方案2:applymap实现(针对单元格逐一处理)
如果需要用类apply的方法实现,可以用applymap对每个单元格单独处理:
def find_value(x): # 仅处理数值类型 if isinstance(x, (int, float)): return 1 if x > 1 else x # 非数值类型直接返回 return x df = df.applymap(find_value)
内容的提问来源于stack exchange,提问作者mdemt
相关产品推荐
相关产品推荐

