Pandas DataFrame中FTID列###值替换为唯一标识的实现问题
你写的代码有两个核心问题:
- Series.apply的lambda默认只能拿到单个元素值,无法直接获取当前行的索引
- 你直接在lambda里调用
df_vol.index会返回整个DataFrame的索引对象,而不是当前行的索引,同时else分支写None会把原本正常的FTID值全部覆盖为空。
优先推荐更高效的掩码操作方案,不需要遍历全量50万行,仅对匹配的3行做修改即可:
方案1:依次替换为###1、###2、###3
# 生成匹配行的布尔掩码 mask = df_vol["FTID"] == "###" # 仅对匹配的3行赋值,生成递增值后缀 df_vol.loc[mask, "FTID"] = [f"###{i+1}" for i in range(mask.sum())]
方案2:拼接###和对应行索引
mask = df_vol["FTID"] == "###" # 提取匹配行的索引转为字符串后拼接 df_vol.loc[mask, "FTID"] = "###" + df_vol.loc[mask].index.astype(str)
如果你确实需要用apply实现,需要改为对整行遍历,通过row.name获取行索引:
# axis=1表示按行遍历,row.name即为当前行的索引 df_vol["FTID"] = df_vol.apply( lambda row: f"###{row.name}" if row["FTID"] == "###" else row["FTID"], axis=1 )
注意:按行apply会遍历全部50万行数据,执行效率远低于掩码操作方案,非必要不推荐使用。
内容的提问来源于stack exchange,提问作者mvern
相关产品推荐
相关产品推荐

