如何解决使用 df.loc 和 astype() 分配给列切片 * 有时* 问题 SettingWithCopyWarning
发出 SettingWithcopyWarning
的代码可以完全复制。请参阅下面的编辑,了解更多奇怪的行为与获取警告的一致性。仅供参考,这与以下 3 个问题不重复:
- python astype(str) gives SettingWithCopyWarning and requests I use loc
- Python - Getting “SettingWithCopyWarning” despite using df.loc
-
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 举报,一经查实,本站将立刻删除。