将 Pandas DataFrame 切片成新的 DataFrame

Posted

技术标签:

【中文标题】将 Pandas DataFrame 切片成新的 DataFrame【英文标题】:Slicing a Pandas DataFrame into a new 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 中。 【参考方案1】:

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

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

警告说明:

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

【讨论】:

这就是我使用的,我改变了它,因为我似乎在某处的文档中读到 .copy() 不是推荐的方式,但我可能弄错了。 是的,如果需要新对象需要复制。如果不需要原始 d1 = d1[d1.a > 1] 也应该可以。

以上是关于将 Pandas DataFrame 切片成新的 DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

按行切片 Pandas DataFrame

Pandas fillna()不适用于DataFrame切片[重复]

切片 pandas 的 MultiIndex DataFrame

Python pandas DataFrame的切片取值

使用 ix() 方法对带有负索引的 pandas DataFrame 进行切片

Pandas fillna()无法处理DataFrame切片[重复]