【问题标题】:PD dataframe misteriously modifiedPD数据框被修改
【发布时间】:2021-05-12 18:21:45
【问题描述】:

以下代码是我的数据科学项目笔记本的块之一。 “frame”是一个数据框,“graf4”是我尝试复制框架并对其进行修改以获取 mt 季节性情节。

但是,每次运行这段代码时,“frame”数据帧的值都会乘以 3000,这对我来说没有意义,因为据我了解,下面的代码从未修改过“frame”并在最后删除“graf4”。我所期望的是只看到我想要的情节而不修改“框架”。截至目前,我的情节中“价格”的值是错误的,原因似乎是在这段代码中发生的“框架”df中“价格”列的值发生了一些不希望的变化。预先感谢您帮助找出问题所在。

graf4 = frame

graf4['cost'] = graf4['price']*graf4['tickets']

graf4 = graf4.groupby(['month','year'], as_index=False).agg({'tickets':'sum', 'price':'sum'})

graf4['price'] = graf4['price']/graf4['tickets']

sns.lineplot(data=graf4, x='MES',y='TARIFA',hue='ANO')

del(graf4)

frame.head() #inserted to test the described mistake

作为一个注释,这个块的目的是总结每张票的平均价格。为了实现这个目标,我通过在 groupby 子句之前将价格和票数相乘将票价转换为票价总成本,并在 groupby 子句之后通过将列除以票数将其转换回。

【问题讨论】:

  • 在python中使用deepcopy作为=是浅拷贝例如li2 = copy.deepcopy(li1)
  • stackoverflow.com/questions/62538804/… 也是相关的。这个问题稍微复杂一些。有时您会 幸运 因为许多 pandas 操作会创建新对象,因此这些操作本身会破坏浅层副本(即您的 groupby 行不会修改帧,该行之后的任何内容也不会,因为此时链接已断开)

标签: python pandas dataframe


【解决方案1】:

如果你这样做

graf4 = frame

不要创建 DataFrame 的副本,而只是创建对同一对象的新引用。所以如果你修改graf4,这也会修改frame

要创建 DataFrame 的副本,您可以使用 DataFrame.copy() 方法:

graf4 = frame.copy() # creates a copy of graf4 so frame will not be touched by any following actions

【讨论】:

  • 我之前评论了答案,建议帮助用户自己找出简单的小代码异常,而不是喂他们。
  • 一切都不是为了点赞和评分:)
猜你喜欢
  • 2019-08-01
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
  • 2023-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多