Pandas如何按数值条件将DataFrame列的数字替换为对应字符串
解决方案
方法1:使用pd.cut一键实现(推荐)
这是最简洁也不会出现类型冲突的方法,直接对原始数值列做分箱映射,一次性生成结果:
import pandas as pd df=pd.DataFrame({'my_col':[1,0,1,0,4,5,8,10,12]}) df['my_col'] = pd.cut( df['my_col'], bins=[-float('inf'), 1, 10, float('inf')], labels=['1 or less', '2 to 10', 'more than 10'] )
分箱规则完全匹配需求,全程不会出现中间混合类型的问题,性能也比逐行判断更高。
方法2:按条件分步赋值的正确写法
你原有代码的核心问题有两个:
type(df['my_col']) != str的判断逻辑错误:df['my_col']是Series对象,永远不可能是str类型,这个判断完全无效- 第一次赋值后列类型变成字符串和数值的混合类型,后续做数值比较直接触发类型错误
正确的分步处理逻辑是先基于原始数值列把所有判断条件提前算好,再按条件赋值,避免中间出现混合类型比较的问题:
df=pd.DataFrame({'my_col':[1,0,1,0,4,5,8,10,12]}) # 先基于原始数值列算出所有布尔掩码 mask1 = df['my_col'] <= 1 mask2 = (df['my_col'] > 1) & (df['my_col'] <= 10) mask3 = df['my_col'] > 10 # 再按掩码批量赋值 df.loc[mask1, 'my_col'] = '1 or less' df.loc[mask2, 'my_col'] = '2 to 10' df.loc[mask3, 'my_col'] = 'more than 10'
之前apply方法不生效的原因
你写的df[df['my_col'].apply(lambda x: not isinstance(x, str))].loc[...]返回的是原DataFrame的切片副本,对副本赋值不会同步修改原DataFrame,所以看不到变化。
内容的提问来源于stack exchange,提问作者Johan
相关产品推荐
相关产品推荐

