修改Pandas DataFrame列时出现SettingWithCopyWarning的问题求助
解决Pandas的SettingWithCopyWarning问题:.loc与.copy无效的情况
问题说明
使用Pandas 2.2.2及Python 3.12,修改DataFrame列时触发SettingWithCopyWarning。已尝试按照官方建议使用.loc[]赋值、对DataFrame调用.copy()规避视图修改,但警告仍然存在。
简化问题代码:
data = pd.read_csv(gps_file) data = data[['cts', 'GPS (Lat.) [deg]', 'GPS (Long.) [deg]', 'GPS (2D) [m/s]']] data['time'] = ((data['cts'] - data['cts'][0]) / 1000).round(2)
示例复现代码
以下是可复现该警告的示例代码:
import pandas as pd # 用于复现问题的示例数据 data = pd.DataFrame({ 'cts': [100, 200, 300, 400, 500], 'GPS (Lat.) [deg]': [32.0, 32.1, 32.2, 32.3, 32.4], 'GPS (Long.) [deg]': [34.0, 34.1, 34.2, 34.3, 34.4], 'GPS (2D) [m/s]': [1.0, 1.1, 1.2, 1.3, 1.4] }) # 创建副本试图避免视图相关问题 new_data = data.copy() # 选择相关列 new_data = new_data[['cts', 'GPS (Lat.) [deg]', 'GPS (Long.) [deg]', 'GPS (2D) [m/s]']] # 计算新列'time' new_data.loc[:, 'time'] = ((new_data['cts'] - new_data['cts'].iloc[0]) / 1000).round(2)
实际数据加载方式
实际场景中的数据加载逻辑如下:
# 设置包含数据文件夹的根目录 base_dir = './sample_data' # 初始化存储数据的字典 data_dict = {} # 遍历根目录下的每个文件夹 for folder in os.listdir(base_dir): folder_path = os.path.join(base_dir, folder) if os.path.isdir(folder_path): # 为当前文件夹创建字典条目 data_dict[folder] = {} # 加载GPS文件 for i in range(1, 5): experiment_key = f'Experiment_{i}' gps_file = os.path.join(folder_path, f'{i}p.csv') if os.path.exists(gps_file): gps_data = pd.read_csv(gps_file)
可行解决方案
通过明确使用.loc选取列和行,确保操作对象为原DataFrame而非视图,可消除警告:
data = data[['cts', 'GPS (Lat.) [deg]', 'GPS (Long.) [deg]', 'GPS (2D) [m/s]']] time = ((data.loc[:,['cts']] - data.loc[0,['cts']]) / 1000).round(2) data.loc[:,['time']] = time
关键说明
这里的核心是:
- 计算
time时,用.loc[:, ['cts']]选取整列,用.loc[0, ['cts']]选取首行的cts值,确保操作的是DataFrame的明确引用而非切片产生的视图 - 赋值时使用
.loc[:, ['time']],明确指定要修改的是原DataFrame的列,避免隐式操作视图
内容的提问来源于stack exchange,提问作者BeNavon
相关产品推荐
相关产品推荐

