Pandas DataFrame编辑值后无法保存:移除单元格指定标识符后文本失败问题求助
问题原因分析
这个问题我碰到过不少次,核心原因是你对iterrows()返回的row对象理解有误——它只是原DataFrame行的副本,不是直接引用。你在循环里修改row["Body2"],其实只是改了临时的副本,根本没触碰到原DataFrame的数据,所以最终Body2列还是全NaN。
解决方案1:修正循环逻辑
如果想保留原来的循环思路,只需要把对row["Body2"]的赋值改成直接操作原DataFrame的对应位置即可:
import pandas as pd import numpy as np df = pd.read_excel(r'Desktop\Trial.xlsx') df["Body2"] = np.nan substring = "____________" for index, row in df.iterrows(): if substring in row["Body"]: split_string = row["Body"].split(substring, 1) # 直接通过.loc定位原DataFrame的行和列进行赋值 df.loc[index, "Body2"] = split_string[0] print(df)
这样修改后,赋值操作会直接作用于原DataFrame,处理后的结果就能正常保存到Body2列里了。
解决方案2:使用Pandas矢量化操作(推荐)
Pandas的优势在于矢量化运算,相比iterrows()循环,这种方法速度更快、代码更简洁,尤其适合处理大数据量的场景:
import pandas as pd import numpy as np df = pd.read_excel(r'Desktop\Trial.xlsx') substring = "____________" # 用np.where实现条件赋值:包含子串则取分割后的第一部分,否则设为NaN df["Body2"] = np.where( df["Body"].str.contains(substring), df["Body"].str.split(substring, n=1).str[0], np.nan ) print(df)
如果你的Body列存在缺失值(NaN),可以先做个填充避免报错:
df["Body"] = df["Body"].fillna("")
内容的提问来源于stack exchange,提问作者Khushi Thakkar
相关产品推荐
相关产品推荐

