如何为datetime.date索引的Pandas DataFrame设置行值并解决赋值报错?
解决Pandas设置行值的SettingWithCopyError问题
问题背景
现有如下Pandas DataFrame,索引为datetime.date类型,需要将最后一行设置为NaN值:
EURGBP EURCAD GBPEUR GBPCAD date 2018-06-22 0.87663 1.5459 1.140732 1.763458 2018-06-25 0.88040 1.5542 1.135847 1.765334 2018-06-26 0.88160 1.5549 1.134301 1.763725 2024-05-06 0.55550 0.4444 1.800180 0.800000
尝试通过链式索引赋值时出现错误:
df['EURGBP'].iloc[3] = 'NAN' df['EURCAD'].iloc[3] = 'NAN'
第二条命令抛出:
pandas.core.common.SettingWithCopyError: A value is trying to be set on a copy of a slice from a DataFrame
正确解决方法
方法1:通过索引直接设置整行值
利用索引定位目标行,直接赋值为NaN(推荐使用np.nan或pd.NA,而非字符串'NAN'):
import numpy as np # 也可使用 pd.NA 替代 np.nan df.loc[pd.Timestamp("2024-05-06")] = np.nan
方法2:通过iloc定位最后一行(更通用)
无需指定具体日期,直接定位最后一行:
df.iloc[-1] = np.nan
方法3:单独设置指定列的行值
如果只需要修改部分列,用loc同时指定索引和列名:
df.loc[pd.Timestamp("2024-05-06"), ['EURGBP', 'EURCAD']] = np.nan
错误原因说明
之前的链式索引df['EURCAD'].iloc[3]属于两次切片操作:先取出EURCAD列(可能返回原DataFrame的副本),再通过iloc定位行。修改副本不会同步到原DataFrame,因此Pandas抛出SettingWithCopyError警告。而loc/iloc是直接从原DataFrame定位元素,避免了副本问题。
内容的提问来源于stack exchange,提问作者user21641220
相关产品推荐
相关产品推荐

