使用 .loc 不会使 SettingWithCopyWarning 在 pandas 中消失

Using .loc doesn't make SettingWithCopyWarning disappear in pandas

提问人: 提问时间:3/2/2023 更新时间:3/2/2023 访问量:52

问:

import pandas as pd
cars = pd.read_csv('car_sales.csv')
cars_new = cars.dropna()
for item in ['mileage', 'engine', 'max_power']:
  cars_new[item] = cars_new[item].apply(lambda text: float(text.split()[0]))

上面的代码(使用此数据集)代码给了我

/usr/local/lib/python3.8/dist-packages/pandas/core/indexing.py:1773:设置与复制警告: 尝试在 DataFrame 中的切片副本上设置值。 尝试改用 .loc[row_indexer,col_indexer] = value

我尝试使用代替,但这没有帮助。那么我怎样才能摆脱这个警告呢?cars_new.loc[:,item]cars_new[item]

Python pandas 警告

评论

0赞 G. Anderson 3/2/2023
首先,使用内置的 series.str 方法可以使事情变得更容易,而不是像这样应用简单的操作 尽管如果您编辑问题以在问题正文中包含最小的可重现示例,其中包含您的输入样本和预期输出,而不是作为外部链接,那将会很有帮助cars_new[item].str.split().str[0].astype(float)

答:

1赞 Marcelo Paco 3/2/2023 #1

您遇到的问题是,您正在创建数据帧的浅拷贝并将其设置为 .此问题有两种可能的解决方案:carscars_new

import pandas as pd
cars = pd.read_csv('car_sales.csv')
cars_new = cars.dropna().copy()
for item in ['mileage', 'engine', 'max_power']:
  cars_new[item] = cars_new[item].apply(lambda text: float(text.split()[0]))

默认情况下,使用复制功能会创建数据帧的深层副本。另一种方法是删除变量:cars_new

import pandas as pd
cars = pd.read_csv('car_sales.csv')
cars = cars.dropna()
for item in ['mileage', 'engine', 'max_power']:
  cars [item] = cars [item].apply(lambda text: float(text.split()[0]))

评论

0赞 user19077881 3/3/2023
你是对的!我已经删除了我的评论并为您的答案投了赞成票。