【问题标题】:Slicing a Pandas DataFrame into a new DataFrame将 Pandas DataFrame 切片成新的 DataFrame
【发布时间】:2017-12-11 12:29:59
【问题描述】:

我想使用布尔索引对 DataFrame 进行切片以获得副本,然后在该副本上独立于原始 DataFrame 执行操作。

从这个answer 来看,使用布尔数组选择.loc 会给我一个副本,但是,如果我尝试更改副本,SettingWithCopyWarning 会妨碍我。那么这是否是正确的方法:

import numpy as np
import pandas as pd
d1 = pd.DataFrame(np.random.randn(10, 5), columns=['a', 'b', 'c', 'd', 'e'])
# create a new dataframe from the sliced copy
d2 = pd.DataFrame(d1.loc[d1.a > 1, :])
# do stuff with d2, keep d1 unchanged

【问题讨论】:

  • SettingWithCopyWarning 只是一个警告。它告诉您,您对该 DataFrame 所做的修改不会更改原始 DataFrame。您可以完全禁用它们,也可以在分配后使用d2.is_copy = None
  • DataFrame.is_copy 不再在 API 中。

标签: python pandas copy slice


【解决方案1】:

您需要copyboolean indexing,不需要新的DataFrame 构造函数:

d2 = d1[d1.a > 1].copy()

警告说明:

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

【讨论】:

  • 这就是我使用的,我改变了它,因为我似乎在某处的文档中读到 .copy() 不是推荐的方式,但我可能弄错了。
  • 是的,如果需要新对象需要复制。如果不需要原始 d1 = d1[d1.a > 1] 也应该可以。
猜你喜欢
  • 2017-03-28
  • 2013-09-01
  • 2012-08-06
  • 2017-08-22
  • 2020-12-08
  • 2021-11-22
  • 2021-04-22
  • 2017-05-08
  • 1970-01-01
相关资源
最近更新 更多