一、SettingWithCopyWarning
通常出现在你尝试对 DataFrame 的一个切片进行赋值操作时。Pandas 发出这个警告,是因为它不确定你是否在修改原始数据,还是在操作一个副本,这可能会导致意外的行为。
例如:错误的写法就是没用loc,直接修改:
eachBuildDf['提取层'] = eachBuildDf['户号'].str.extract(r'^(\d{1,2})').astype(float)
解决方法: 你可以使用 .loc
来确保你在原始 DataFrame 上进行修改,而不是在其切片上。具体到你的代码中,你可以这样修改:
# 确保使用 .loc 来避免 SettingWithCopyWarning
eachBuildDf.loc[:, '提取层'] = eachBuildDf['户号'].str.extract(r'^(\d{1,2})').astype(float)
但是在有些情况下还会继续发出警告,例如:
# 通过条件过滤生成切片
filtered_df = eachBuildDf[eachBuildDf['户号'] == '01'] # 尝试在这个切片上进行赋值
filtered_df['提取层'] = filtered_df['户号'].str.extract(r'^(\d{1,2})').astype(float)
这种情况下,filtered_df
可能是副本,而不是视图。因此,修改 filtered_df
可能不会反映到 eachBuildDf
中。这时,Pandas 会发出警告,因为你可能并不清楚你实际上是在修改副本。
为了避免这些问题,确保你对 DataFrame 的所有修改操作都在原始 DataFrame 上进行,或明确创建副本:
df_copy = eachBuildDf.copy()
df_copy['提取层'] = df_copy['户号'].str.extract(r'^(\d{1,2})').astype(float)
以上得分情况去看,一般建议直接创建副本去修改或者新增列
二、FutureWarning警告处理
是提醒你未来版本中 fillna方法的行为可能会发生变化。当前 fillna方法在处理数据类型转换时可能会出现问题,你可以设置 Pandas 的选项来适应未来的行为:
# 设置 Pandas 选项,FutureWarning警告就会消失
pd.set_option('future.no_silent_downcasting', True)