【问题标题】:Setting values on a copy of a slice from a DataFrame [duplicate]在 DataFrame 中的切片副本上设置值 [重复]
【发布时间】: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 修复它们解决了它。谢谢

标签: python pandas


【解决方案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() 那样覆盖变量,内存使用量也会出现峰值。
猜你喜欢
  • 2018-09-18
  • 2016-09-23
  • 1970-01-01
  • 2016-02-17
  • 2016-08-24
  • 2016-06-16
  • 2015-10-06
相关资源
最近更新 更多