如何修复「A value is trying to be set on a copy of a slice from a DataFrame」警告
修复「A value is trying to be set on a copy of a slice from a DataFrame」警告
问题根源
你代码里的data = data[['Question', 'Triplet', 'Answer']]和data = data[data['valid_sample'] == True]都是切片操作,Pandas返回的可能是原DataFrame的视图而非独立副本,后续给data新增Input、Entity列时,就会触发这个警告。
具体修复步骤
1. 显式创建副本,切断视图关联
在两次切片操作后加上.copy(),让data成为独立的DataFrame:
data = pd.read_csv('data/recheck_data.csv') # 第一次切片后加copy() data = data[['Question', 'Triplet', 'Answer']].copy() data.dropna(inplace=True) def valid_sample(item): # DO THINGS if item: return False return True data['valid_sample'] = data['Triplet'].apply(lambda x: valid_sample(x)) # 第二次布尔索引后加copy() data = data[data['valid_sample'] == True].copy()
2. 优化元组列拆分代码(可选,更高效)
你原来用循环iloc取元组元素的写法可以简化,直接用pd.DataFrame转换结果,再合并到原DataFrame:
def process_sub_graph(sub_graph: str): # DO SOMETHING return input_val, entity_val result = data['Triplet'].apply(process_sub_graph) # 直接把元组列表转成DataFrame,自动拆分列 result_df = pd.DataFrame(result.tolist(), columns=['Input', 'Entity']) # 合并到原data data = pd.concat([data, result_df], axis=1)
这样既避免了循环的低效,也能更规范地处理列赋值。
额外说明
如果不想用concat,也可以直接拆分赋值,只要data已经是副本,就不会触发警告:
data['Input'] = [x[0] for x in result] data['Entity'] = [x[1] for x in result]
(比用iloc[i]更简洁)
内容的提问来源于stack exchange,提问作者tjns
相关产品推荐
相关产品推荐

