如何消除Pandas DataFrame操作中的SettingWithCopyWarning警告
解决Pandas的SettingWithCopyWarning警告
原代码
import pandas as pd import datetime as dt from pathlib import Path #%% Specify the path and load the data path = Path('./../') # Load the data data = pd.read_csv(path / 'data/data.csv') data.loc[:,'Date'] = pd.to_datetime(list(data['Date_x']), format='%Y-%m-%d').date
触发的警告
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value insteadSee the caveats in the documentation
data.loc[:,'Date'] = pd.to_datetime(list(data['Date_x']), format='%Y-%m-%d').date
解决方案
出现该警告的核心原因是Pandas检测到你可能在一个DataFrame的切片副本上修改数据,而非原始DataFrame。以下是两种无警告的修复方式:
方式1:创建独立副本
读取数据后直接生成副本,确保后续操作在独立的DataFrame上执行:
import pandas as pd import datetime as dt from pathlib import Path path = Path('./../') # 读取数据并创建副本 data = pd.read_csv(path / 'data/data.csv').copy() # 转换日期并赋值 data['Date'] = pd.to_datetime(data['Date_x'], format='%Y-%m-%d').dt.date
方式2:使用assign生成新列
通过assign方法返回包含新列的新DataFrame,避免直接修改原对象:
import pandas as pd import datetime as dt from pathlib import Path path = Path('./../') data = pd.read_csv(path / 'data/data.csv') # 生成带新列的新DataFrame data = data.assign(Date=pd.to_datetime(data['Date_x'], format='%Y-%m-%d').dt.date)
额外优化说明
- 无需将
data['Date_x']转为列表,直接传入pd.to_datetime即可正常处理 - 使用
.dt.date替代.date,这是Pandas Series访问日期属性的标准方式,更符合Pandas的API规范
内容的提问来源于stack exchange,提问作者TRK
相关产品推荐
相关产品推荐

