You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 21:15:04