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

Python基于Hotel ID列生成Old/New标记列的代码错误排查

Python基于Hotel ID列生成Old/New标记列的代码错误排查

嗨,作为第一次写Python代码就尝试自动化任务,已经超棒啦!咱们来一步步梳理你的问题,把代码改对~

先明确你的需求

你已经把DataFrame按Hotel Id排好序了,现在要新增Old/New列,规则是:

  • 如果当前行的Hotel Id和下一行的Hotel Id相同,当前行标记为Old
  • 否则标记为New

现有代码的问题

咱们来看你写的这段代码的几个小问题:

  1. 逻辑方向搞反了:你现在是拿当前行和上一行的Hotel Id比较,而不是需求里的下一行,这就导致标记的行完全错位了
  2. 循环范围不对:range(1, len(df)-1)会跳过第一行和最后一行,比如数据有5行的话,只会处理第2、3行,漏掉了第1行,最后一行也没处理(不过你默认设了New,这点影响不大,但逻辑还是不对)
  3. 循环效率低:Pandas本身是为矢量化操作设计的,循环处理大数据集会很慢

修正方案

方案1:修正你的循环代码(适合刚入门理解逻辑)

先把逻辑和循环范围调整对,代码如下:

def asignar_old_new(df):
    df['Old/New'] = 'New'  # 先默认所有行都是New
    # 遍历除最后一行外的所有行(因为最后一行没有下一行)
    for i in range(len(df) - 1):
        # 比较当前行和下一行的Hotel Id
        if df['Hotel Id'].iloc[i] == df['Hotel Id'].iloc[i+1]:
            df.loc[i, 'Old/New'] = 'Old'
    return df

这样循环会覆盖从第0行到倒数第二行的所有行,每一行都和下一行对比,最后一行保持默认的New,完全符合你的需求。

方案2:推荐的Pandas矢量化写法(高效简洁)

用Pandas的shift()函数可以轻松实现下一行的对比,代码更简洁,处理大数据也快得多:

import numpy as np

def asignar_old_new(df):
    # shift(-1)会把下一行的Hotel Id移到当前行的位置,最后一行会变成NaN
    df['Old/New'] = np.where(df['Hotel Id'] == df['Hotel Id'].shift(-1), 'Old', 'New')
    return df

解释一下:df['Hotel Id'].shift(-1)生成一个新的序列,每个位置的值是原序列下一行的值,最后一行没有下一行,所以是NaN。用np.where()判断:如果当前行Hotel Id等于下一行的值,就标Old,否则标New,最后一行因为和NaN不相等,自然会标New,完美匹配你的规则。

验证效果

比如你的数据里有连续的Hotel Id=23的行:

  • 第一行23和下一行23相同,会标Old
  • 第二行23如果下一行不是23,就会标New
    这样就和你期望的结果一致啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 11:54:33