当前位置: 首页 > 知识库问答 >
问题:

Pandas DataFrame: SettingAnd CopyWarning:一个值正试图从DataFrame[复制]的一个片的副本上设置

卢子民
2023-03-14

我知道有很多关于这个警告的帖子,但是我找不到解决我的问题的办法。这是我的密码:

df.loc[:, 'my_col'] = df.loc[:, 'my_col'].astype(int)
#df.loc[:, 'my_col'] = df.loc[:, 'my_col'].astype(int).copy()
#df.loc[:, 'my_col'] = df['my_col'].astype(int)

它产生警告:

SettingWithCopyWarning:试图在数据帧切片的副本上设置值。尝试改用.loc[row\u indexer,col\u indexer]=value

即使我按照建议更改了代码,我仍然收到此警告?我所需要做的就是转换一列的数据类型。

**备注:**最初该列是具有一个十进制的浮点数类型(例如:4711.0)。因此,我将其更改为整数(4711),然后更改为字符串('4711')-只是为了删除小数。

谢谢你的帮助!

更新:该警告是之前对原始数据进行过滤的副作用。我缺少DataFrame.copy()。改为使用副本,解决了问题!

df = df[df['my_col'].notnull()].copy()
df.loc[:, 'my_col'] = df['my_col'].astype(int).astype(str)
#df['my_col'] = df['my_col'].astype(int).astype(str) # works too!

共有3个答案

柴阳云
2023-03-14

如果需要更改单个列的数据类型,则更容易直接处理该列:

df['my_col'] = df['my_col'].astype(int)

或使用。分配

df = df.assign(my_col=lambda d: d['my_col'].astype(int))

如果您只需要转换一次,并且不想在该范围之外更改您的df,则

何涵忍
2023-03-14

另一种方法是禁用链式分配,它可以在代码上运行,而不需要创建副本:

# disable chained assignments
pd.options.mode.chained_assignment = None 
仇经武
2023-03-14

我认为需要复制并省略选择列的loc

df = df[df['my_col'].notnull()].copy()
df['my_col'] = df['my_col'].astype(int).astype(str)

说明:

如果稍后修改df中的值,您将发现修改不会传播回原始数据(df),并且不会发出警告。

 类似资料:
  • 问题内容: Jupiter Nootbook返回此警告: 请参阅文档中的警告:http : //pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus- copy 请参阅文档中的警告:http : //pandas.pydata.org/pandas-docs/stable/indexing.html#inde

  • 运行以下代码时: 我得到以下警告: 正在尝试在DataFrame的切片副本上设置值。尝试使用. loc[row_indexer,col_indexer]=value来代替查看留档中的警告:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 但这正是我想要的行为(真实的表非常大,我不想

  • 问题内容: 我有一个小数据框,说这个: 我想要column的滚动平均值,所以我这样做: 它的工作方式如下:我有一个新的列,该列包含我希望包含的内容,但我也收到警告消息: 试图在DataFrame的切片副本上设置一个值。尝试改用.loc [row_indexer,col_indexer] = value 请参阅文档中的警告:http : //pandas.pydata.org/pandas-docs

  • 问题内容: 这个问题已经被问了很多遍了,而且似乎对其他人也有用,但是,当我从不同的DataFrame复制列(并且长度相同)时,我得到了值。 我需要这样 我尝试了以下方法 我得到以下内容 问题答案: 您的DataFrames的索引是不同的 (相应地,每列 的索引也不同 ),因此,当尝试将一个DataFrame的列分配给另一列时, pandas会尝试对齐索引,但这样做会失败,请插入NaN。 考虑以下示

  • 我的屏幕上有一个按钮,我需要在单击按钮时传递布尔值。 在这里,当点击按钮时,它会启动一个片段并打开另一个屏幕,我只需要显示一个按钮。 同样,如果我从另一个片段导航,那么同一个按钮需要显示所有屏幕视图。 我可以沿着这个发送一个布尔值吗?它将如何在另一个片段中检索?