在数据帧的切片副本上设置值[重复]
Posted
技术标签:
【中文标题】在数据帧的切片副本上设置值[重复]【英文标题】:Setting values on a copy of a slice from a DataFrame [duplicate] 【发布时间】:2015-10-06 17:21:45 【问题描述】:我有一个小数据框,说这个:
Mass32 Mass44
12 0.576703 0.496159
13 0.576658 0.495832
14 0.576703 0.495398
15 0.576587 0.494786
16 0.576616 0.494473
...
我想要列Mass32
的滚动平均值,所以我这样做:
x['Mass32s'] = pandas.rolling_mean(x.Mass32, 5).shift(-2)
它的工作原理就像我有一个名为 Mass32s
的新列,其中包含我希望它包含的内容,但我也收到警告消息:
试图在 DataFrame 中的切片副本上设置值。尝试 使用 .loc[row_indexer,col_indexer] = value 代替
请参阅文档中的注意事项: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
我想知道是否有更好的方法来做到这一点,尤其是避免收到此警告消息。
【问题讨论】:
我没有收到警告消息,当我使用您的示例代码运行时,您能否检查您是否在代码的前面设置了x
作为数据框的副本,例如 @ 987654327@
数据框中有几个 Nas 显然是在搞乱我。用 fillna(0) 和 .loc 修复它们解决了它。谢谢
【参考方案1】:
出现此警告是因为您的数据框 x
是切片的副本。这并不容易知道原因,但它与您如何进入当前状态有关。
您可以通过以下方式从 x 中创建一个合适的 dataframe
x = x.copy()
这将删除警告,但它不是正确的方法
您应该使用DataFrame.loc
方法,如警告所示,如下所示:
x.loc[:,'Mass32s'] = pandas.rolling_mean(x.Mass32, 5).shift(-2)
【讨论】:
数据框中有几个 Nas 显然在惹我生气。用 fillna(0) 和 .loc 修复它们解决了它。谢谢 第一种方法有时有效......第二种方法方法让我得到以下错误 indexer = self._get_setitem_indexer(key) ,在 _get_setitem_indexer raise IndexingError(key) IndexingError: (slice(None, None,无),'Mass32s') @Lcat 听起来您的数据框索引中没有任何值。你能用一些示例数据提出一个新问题吗?传给我? 为什么这种方法更好? @mxbi 复制数据帧会进行复制,从而使使用的内存加倍。即使您像我的示例x = x.copy()
那样覆盖变量,内存使用量也会出现峰值。以上是关于在数据帧的切片副本上设置值[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Pandas DataFrame:SettingWithCopyWarning:试图在 DataFrame 的切片副本上设置一个值 [重复]
对于使用 Dask 的 Series 对象,“试图在来自 DataFrame 的切片的副本上设置一个值”?