Pandas中如何计算前一行差值新增列并解决SettingWithCopyWarning报错?
报错原因
当你通过df.loc[过滤条件]获取子数据集时,Pandas默认返回的是原DataFrame的视图(与原数据共享内存的切片),而非独立的新对象。此时直接对该切片赋值新列,Pandas无法判断你是否希望修改原DataFrame,因此抛出SettingWithCopyWarning警告,该警告虽不阻断代码运行,但存在修改不生效、意外改动原数据集等风险。
单个县新增列解决方案
筛选子数据集时主动调用.copy()方法生成独立的DataFrame即可,修改后代码如下:
import pandas as pd import requests df = pd.read_csv("https://raw.githubusercontent.com/nytimes/covid-19-data/master/us-counties.csv") # 新增.copy()生成独立子数据集 df1 = df.loc[(df['state'] == 'New Hampshire') & (df['county'] == 'Rockingham')].copy() # 此时赋值不会触发警告 df1['new cases'] = df1['cases'].diff() # 若需要将每个县首行的空差值替换为0,可补充下行代码 df1['new cases'] = df1['new cases'].fillna(0)
全量各县独立计算新增方案
无需拆分单个县的子数据集,直接通过groupby分组批量完成所有县的新增计算,执行效率更高:
# 按「州+县」组合唯一标识分组,每个分组内单独计算病例差值 df['new cases'] = df.groupby(['state', 'county'])['cases'].transform(lambda x: x.diff()) # 按需替换首行空值为0 df['new cases'] = df['new cases'].fillna(0)
内容的提问来源于stack exchange,提问作者Acuity
相关产品推荐
相关产品推荐

