Python基于Hotel ID列生成Old/New标记列的代码错误排查
Python基于Hotel ID列生成Old/New标记列的代码错误排查
嗨,作为第一次写Python代码就尝试自动化任务,已经超棒啦!咱们来一步步梳理你的问题,把代码改对~
先明确你的需求
你已经把DataFrame按Hotel Id排好序了,现在要新增Old/New列,规则是:
- 如果当前行的
Hotel Id和下一行的Hotel Id相同,当前行标记为Old - 否则标记为
New
现有代码的问题
咱们来看你写的这段代码的几个小问题:
- 逻辑方向搞反了:你现在是拿当前行和上一行的
Hotel Id比较,而不是需求里的下一行,这就导致标记的行完全错位了 - 循环范围不对:
range(1, len(df)-1)会跳过第一行和最后一行,比如数据有5行的话,只会处理第2、3行,漏掉了第1行,最后一行也没处理(不过你默认设了New,这点影响不大,但逻辑还是不对) - 循环效率低: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
相关产品推荐
相关产品推荐

