如何按pandas DataFrame每行指定长度截取字符串并避免SettingWithCopyWarning
警告触发原因
SettingWithCopyWarning是pandas的安全校验提示:你当前用逐行索引赋值的方式操作时,pandas无法确认你用到的df是原始对象还是从其他数据切片生成的副本,直接赋值可能不会作用到原始数据上,因此抛出该警告。
解决方案
方案1:向量化操作(优先推荐)
用pandas内置的apply方法按行处理,完全规避循环赋值的问题,执行效率远高于手动遍历,代码也更简洁:
df['String'] = df.apply(lambda row: row['String'][row['length']:], axis=1)
如果你的列名是小写string,对应修改代码里的列名即可。
方案2:显式声明副本
如果要保留原有循环逻辑,只需要在操作前显式拷贝DataFrame,明确告知pandas你要修改的就是当前这个对象:
# 先做显式拷贝 df = df.copy() # 再运行原有代码即可 for i in range(len(df.index)): val = df['string'].iloc[i] n = df['length'].iloc[i] df['string'].iloc[i] = val[n:]
内容的提问来源于stack exchange,提问作者Jess Kaligas
相关产品推荐
相关产品推荐

