Python Pandas:根据末尾数字移除字符串尾部字符及报错求助
问题解决与代码优化
1. 修复TypeError错误
你遇到的TypeError: 'method' object is not iterable是因为df.iterrows是DataFrame的方法,必须加括号调用(即df.iterrows())才能返回可迭代的行对象。之前的代码漏掉了括号,导致遍历的是方法本身而非行数据。
2. 实现正确的字符移除逻辑
原代码没有判断条件,直接执行两次替换会导致逻辑混乱(比如末尾是20的字符串会先被移除最后一位变成"2",再被判断是否符合0-5又移除一位)。正确逻辑需要先判断末尾是否为"20"(优先处理两位的情况),再判断是否为0-5的单个数字。
修复后的遍历行版本
def vvv(df): for index, row in df.iterrows(): # 修复:添加括号调用iterrows() ft_str = row['FT'] # 优先判断末尾是否为"20",移除最后两位 if ft_str.endswith('20'): df.loc[index, 'FT'] = ft_str[:-2] # 判断末尾是否为0-5的数字,移除最后一位 elif len(ft_str) > 0 and ft_str[-1].isdigit() and int(ft_str[-1]) <= 5: df.loc[index, 'FT'] = ft_str[:-1] return df
注意:直接修改
row['FT']不会改变原DataFrame(因为iterrows返回的是行副本),所以要用df.loc[index, 'FT']来定位修改。
更高效的向量化实现(推荐)
遍历行效率较低,尤其当DataFrame数据量大时,推荐使用apply函数实现向量化处理:
def process_ft(s): # 处理空字符串的边界情况 if not s: return s # 先判断末尾是否为"20" if s.endswith('20'): return s[:-2] # 判断末尾是否为0-5的数字 elif s[-1].isdigit() and int(s[-1]) <= 5: return s[:-1] # 不符合条件则返回原字符串 return s # 直接对FT列应用处理函数 df['FT'] = df['FT'].apply(process_ft)
内容的提问来源于stack exchange,提问作者ella
相关产品推荐
相关产品推荐

