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

基于分组规则转换Pandas列值的实现方法

基于分组规则转换Pandas列值的实现方法

嗨,我来给你分享几个实用的解决思路,都是Pandas里处理这类值映射问题的常用技巧,你可以根据自己的习惯来选:

  • 方法一:嵌套np.where实现多条件判断
    虽然你一开始觉得np.where更适合二进制转换,但其实嵌套起来完全能处理多分组的情况,代码逻辑也很清晰:
import numpy as np
import pandas as pd

# 假设你的目标列名为'col'
df['new_col'] = np.where(
    df['col'].isin([1.0, 2.0]), 
    1.0,
    np.where(
        df['col'].isin([3.0, 4.0]), 
        2.0, 
        3.0
    )
)

原理很简单:先判断值是否在{1.0,2.0}里,符合就赋值1.0;不符合的话进入下一层判断,值在{3.0,4.0}就赋值2.0;剩下的5.0统一赋值3.0。

  • 方法二:用.loc掩码分步赋值
    这就是你想到的思路,确实非常直观,每一步都明确对应一个分组规则,调试起来也方便:
# 先复制原列到新列(也可以直接修改原列,看需求)
df['new_col'] = df['col'].copy()

# 把1.0/2.0替换为1.0
df.loc[df['col'].isin([1.0, 2.0]), 'new_col'] = 1.0
# 把3.0/4.0替换为2.0
df.loc[df['col'].isin([3.0, 4.0]), 'new_col'] = 2.0
# 把5.0替换为3.0
df.loc[df['col'] == 5.0, 'new_col'] = 3.0

这种方法的好处是逻辑拆分清晰,哪怕后续规则有调整,直接修改对应的行就行。

  • 方法三:用map映射字典(最推荐)
    如果你的分组规则是固定的键值对应,用字典映射绝对是最简洁直观的方式,一眼就能看懂每个旧值对应什么新值:
# 定义映射规则字典
value_mapping = {
    1.0: 1.0,
    2.0: 1.0,
    3.0: 2.0,
    4.0: 2.0,
    5.0: 3.0
}

# 直接映射生成新列
df['new_col'] = df['col'].map(value_mapping)

后续如果要修改规则,只需要调整字典里的键值对就行,维护成本很低。

  • 方法四:用pd.cut做区间分组
    如果你的值是连续的区间(这里虽然是离散值,但也适用),pd.cut也是个不错的选择,适合按范围划分的场景:
df['new_col'] = pd.cut(
    df['col'],
    bins=[0, 2, 4, np.inf],  # 划分区间:(0,2], (2,4], (4,∞)
    labels=[1.0, 2.0, 3.0],  # 每个区间对应的新值
    include_lowest=True  # 确保1.0被包含在第一个区间里
)

# 如果需要把结果转为数值类型,加上这一句
df['new_col'] = df['new_col'].astype(float)

以上几种方法都能完美实现你的需求,我个人最推荐map字典映射的方式,代码简洁且可读性高;如果你的规则后续可能有复杂调整,.loc分步赋值会更灵活。

备注:内容来源于stack exchange,提问作者hulio_entredas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 10:19:10