如何避免 Pandas 中的 SettingWithCopyWarning?

Posted

技术标签:

【中文标题】如何避免 Pandas 中的 SettingWithCopyWarning?【英文标题】:How to avoid SettingWithCopyWarning in pandas? 【发布时间】:2017-04-25 20:56:07 【问题描述】:

我想使用 pandas 将列的类型转换为 int。这是源代码:

# CustomerID is missing on several rows. Drop these rows and encode customer IDs as Integers.
cleaned_data = retail_data.loc[pd.isnull(retail_data.CustomerID) == False]
cleaned_data['CustomerID'] = cleaned_data.CustomerID.astype(int)

这会引发以下警告:

SettingWithCopyWarning:试图在一个副本上设置一个值 从 DataFrame 切片

如何避免此警告?有没有更好的方法将 CustomerID 的类型转换为 int?我在 python 3.5 上。

【问题讨论】:

可能重复:***.com/q/38809796/190597 【参考方案1】:

合二为一loc:

retail_data.loc[~retail_data.CustomerID.isnull(),'CustomerID'] = retail_data.loc[~retail_data.CustomerID.isnull(),'CustomerID'].astype(int)

例子:

import pandas as pd
import numpy as np

retail_data = pd.DataFrame(np.random.rand(4,1)*10, columns=['CustomerID'])
retail_data.iloc[2,0] = np.nan
print(retail_data)

   CustomerID
0    9.872067
1    5.645863
2         NaN
3    9.008643

retail_data.loc[~retail_data.CustomerID.isnull(),'CustomerID'] = retail_data.loc[~retail_data.CustomerID.isnull(),'CustomerID'].astype(int)

       CustomerID
0         9.0
1         5.0
2         NaN
3         9.0

您会注意到列的 dtype 仍然是浮点数,因为 np.nan 不能在 int 列中编码。

如果您真的想删除这些行而不更改底层的retail_data,请创建一个实际的copy()

cleaned_data = retail_data.loc[~retail_data.CustomerID.isnull()].copy()

【讨论】:

以上是关于如何避免 Pandas 中的 SettingWithCopyWarning?的主要内容,如果未能解决你的问题,请参考以下文章

在 Pandas 数据框中加载大表时,如何避免 EC2 中的内存错误?

如何避免大型数据集的Pandas DataFrame中的for循环

python: pandas.DataFrame,如何避免keyerror?

字符串中的 Pyspark 双字符替换避免某些单词而不映射到 pandas 或 rdd

如何让 pandas get_dummies 发出 N-1 个变量以避免共线性?

如何在 Pandas Python 中合并时避免笛卡尔坐标