使用 df.loc 和 astype() 分配给列切片 * 有时* 问题 SettingWithCopyWarning

如何解决使用 df.loc 和 astype() 分配给列切片 * 有时* 问题 SettingWithCopyWarning

发出 SettingWithcopyWarning代码可以完全复制。请参阅下面的编辑,了解更多奇怪的行为与获取警告的一致性。仅供参考,这与以下 3 个问题不重复

  1. python astype(str) gives SettingWithCopyWarning and requests I use loc
    • “在分配之前的某个时间点,您创建了 df 以使其成为另一个数据框的视图。”
    • 我的可以使用下面的代码从头开始创建,而不是从另一个 df 中创建。
  2. Python - Getting “SettingWithCopyWarning” despite using df.loc
    • “使用以下代码创建第二个数据框...”
    • 我只创建和使用一个 DataFrame。
  3. How to deal with SettingWithCopyWarning in Pandas
    • 我正在使用 .loc 但我正在分配给一个列切片;未包含在那里的答案中。

代码

df = pd.DataFrame({
    'Fruits': ['apple','orange','banana','pineapple','watermelon'],'Volume 1': [10,20,30,700,800],'Volume 2': [100,200,300,7000,8000],'Volume 3': [1,2,3,70,8],'Volume 4': [9,8,7,6,5],'Other': [-1,-2,-3,-4,-5]
})

df.loc[:,'Volume 2':'Volume 4'] = df.loc[:,'Volume 2':'Volume 4'].shift(1)
df = df.dropna()
# All okay so far,no warnings


# This next line issues a `SettingWithcopyWarning`:
df.loc[:,'Volume 2':'Volume 4'].astype(int)  # warning
# and if I execute this line again,it Now issues SWC warning:
df.loc[:,'Volume 2':'Volume 4'].shift(1)  # warning

# And any following operation Now issues the SWCW:
df['A'] = 'foo'  # new column
df['Fruits'] = 'a fruit'  # existing column

我可以通过执行以下任一操作来消除警告:

df = df.dropna()
# or
df = df.copy()

如果我然后重做之前 astype() 步骤的不同版本,没有警告

df.loc[:,'Volume 2':'Volume 4'].astype(float)  # no warning
df.loc[:,'Volume 2':'Volume 4'].astype(int)  # no warning

如果第一个 astype() 步骤发出 SettingWithcopyWarning,为什么这些没有?不应该是一致的吗?我使用的是 Pandas 版本“1.2.2”。

顺便说一句,即使我可以在一个 astype() 步骤中明确列出我正在转换的所有列,但它们也会以这些不同的方式发出 SWC 警告:

df.loc[:,'Volume 2':'Volume 4'] = df[['Volume 2','Volume 3','Volume 4']].astype(int)
df[['Volume 2','Volume 4']] = df.loc[:,'Volume 2':'Volume 4'].astype(int)
df[['Volume 2','Volume 4']] = df[['Volume 2','Volume 4']].astype(int)

编辑/更新:在 JupyterLab 和 IPython 中,如果 dropna() 在与 shift() 步骤相同的单元格中执行,则不会发出警告。 所以这可能与内核有关。这是pastebin link to the IPython code

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?