在数据帧的切片副本上设置值[重复]

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 的切片的副本上设置一个值”?

在熊猫切片上设置值的正确方法[重复]

试图在 DataFrame 中的切片副本上设置一个值

Python:SettingWithCopyWarning:试图在 DataFrame 中的切片副本上设置值

Pandas SettingWithCopyWarning:试图在 DataFrame 中的切片副本上设置值