pandas的SettingWithCopyWarning告警产生的原因、解决方法

问题复现

要处理的数据格式:
在这里插入图片描述

假设我们只想对1月份的数据进行处理:

import pandas as pd

data = pd.read_csv('weather.csv')
# print(data.head())

# 只选1月份的数据进行分析
condition = data['日期'].str.startswith('2023-01')
# print(condition)
# 设置温差
data[condition]['温差'] = data['最高气温'] - data['最低气温']
# 看看是否修改成功
data[condition].head()

运行输出:

D:\temp\python_work\pandas-practice\test.py:10: 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 instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  data[condition]['温差'] = data['最高气温'] - data['最低气温']

由输出可以看到,出现了SettingWithCopyWarning告警。

问题原因

发出告警的代码data[condition]['温差'] = data['最高气温'] - data['最低气温']

在 Pandas 中,链式操作(如 data[condition]['温差'])可能会导致不确定的行为。

Pandas 无法确定 data[condition] 返回的是原始数据的视图(view)还是副本(copy)。

如果返回的是副本,那么对副本的修改不会反映到原始数据中。

核心要点:pandas的DataFrame修改写操作,只允许在源DataFrame上进行,一步到位。

解决方法

解决方法1:使用 .loc 进行显式赋值,用一个步骤完成修改操作

这个方法使用.loc,是一步操作,直接在源DataFrame上修改。

import pandas as pd

data = pd.read_csv('weather.csv')
print('下面是原始数据的前几行:')
print(data.head())
print('-------------------------------------')

# 只选1月份的数据进行分析
condition = data['日期'].str.startswith('2023-01')
# 设置温差
data.loc[condition, '温差'] = data['最高气温'] - data['最低气温']

# 看看是否修改成功
print('下面是修改后数据的前几行:')
print(data.head())

运行输出:

下面是原始数据的前几行:
           日期  最高气温  最低气温  天气
0  2023-01-01    17    12  多云
1  2023-01-02    19    12  多云
2  2023-01-03    17    12  多云
3  2023-01-04    18    13  多云
4  2023-01-05    22    14  多云
-------------------------------------
下面是修改后数据的前几行:
           日期  最高气温  最低气温  天气   温差
0  2023-01-01    17    12  多云  5.0
1  2023-01-02    19    12  多云  7.0
2  2023-01-03    17    12  多云  5.0
3  2023-01-04    18    13  多云  5.0
4  2023-01-05    22    14  多云  8.0

解决方法2:使用 .copy() 方法,显式创建一个副本,避免修改原始数据

import pandas as pd

data = pd.read_csv('weather.csv')
print('下面是原始数据的前几行:')
print(data.head())
print('-------------------------------------')

# 只选1月份的数据进行分析
condition = data['日期'].str.startswith('2023-01')
# 使用copy()方法得到一个新的DataFrame
data2 = data[condition].copy()
# 在新的DataFrame上增加 温差 这列
data2['温差'] = data['最高气温'] - data['最低气温']

print('下面是新数据的前几行:')
print(data2.head())

运行输出:

下面是原始数据的前几行:
           日期  最高气温  最低气温  天气
0  2023-01-01    17    12  多云
1  2023-01-02    19    12  多云
2  2023-01-03    17    12  多云
3  2023-01-04    18    13  多云
4  2023-01-05    22    14  多云
-------------------------------------
下面是新数据的前几行:
           日期  最高气温  最低气温  天气  温差
0  2023-01-01    17    12  多云   5
1  2023-01-02    19    12  多云   7
2  2023-01-03    17    12  多云   5
3  2023-01-04    18    13  多云   5
4  2023-01-05    22    14  多云   8
### 回答1: SettingWithCopyWarning是一种由Pandas库抛出的警告,表明您正在尝试执行可能会导致混淆的操作。要关闭这个警告,可以使用以下代码:pd.options.mode.chained_assignment = None ### 回答2: SettingWithCopyWarning是一种来自pandas库的告警信息,当我们对DataFrame进行链式索引操作时可能会触发这个告警。这个告警的意思是在对DataFrame进行赋值操作时可能会出现潜在的副作用,即可能会改变原始数据的拷贝对象而非原始对象本身。 要关闭SettingWithCopyWarning告警,有以下几种方法: 1. 使用.loc或.iloc进行索引操作:使用.loc或.iloc来进行索引操作,可以明确指定所访问数据的视图是一个副本还是原始数据,从而避免触发该告警。 2. 使用.copy()方法创建副本:在进行链式索引操作之前,先使用.copy()方法创建原始数据的副本,然后对副本进行操作,这样就不会改变原始数据,也避免了此告警的触发。 3. 设置pandas选项:通过设置pandas选项,可以在运行代码时忽略SettingWithCopyWarning告警。例如,在代码开头加上如下一行代码:pd.set_option('mode.chained_assignment', None)。但是需要注意的是,这样设置会忽略所有的SettingWithCopyWarning告警,包括可能会影响到数据的潜在副作用,所以在设置时要慎重考虑。 总之,了解SettingWithCopyWarning的含义和产生原因是很重要的,可以根据具体情况选择合适的方法来关闭该告警。 ### 回答3: SettingWithCopyWarning是一个来自pandas库的警告信息,意思是在对pandas的DataFrame或Series对象进行切片、筛选、赋值等操作时,可能会导致对原始数据的意外修改或创建副本的问题。 这个警告的出现是为了提醒我们潜在的错误,并防止在不经意间造成数据问题。当我们对一个DataFrame进行类似切片操作时,pandas会尽量返回原始数据的视图(view)以节省内存,并且希望我们了解这种操作可能带来的风险。 要关闭SettingWithCopyWarning这个警告,有以下几种方法: 1. 尽量使用.loc或.iloc来对DataFrame进行切片操作,这样可以明确地指定我们是在视图上进行操作,而不是创建副本。 2. 使用.copy()方法创建副本,这样我们就可以对副本进行操作,而不会修改原始数据。例如,可以将切片操作改为df_new = df[df['column'] > 0].copy()。 3. 设置pandas的配置选项,使得警告被忽略。可以使用pd.options.mode.chained_assignment = None来关闭警告。但需要注意的是,这种做法会关闭所有与SettingWithCopyWarning相关的警告信息,可能会导致其他潜在问题被忽略。 总之,要避免SettingWithCopyWarning导致的潜在问题,建议我们在对DataFrame进行切片、筛选、赋值等操作时,明确操作的是视图还是副本,并根据具体需求采取相应的操作方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值