将 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】:
您需要copy
和boolean indexing
,不需要新的DataFrame
构造函数:
d2 = d1[d1.a > 1].copy()
警告说明:
如果您稍后修改 d2
中的值,您会发现修改不会传播回原始数据 (d1
),并且 Pandas 会发出警告。
【讨论】:
这就是我使用的,我改变了它,因为我似乎在某处的文档中读到.copy()
不是推荐的方式,但我可能弄错了。
是的,如果需要新对象需要复制。如果不需要原始 d1 = d1[d1.a > 1]
也应该可以。以上是关于将 Pandas DataFrame 切片成新的 DataFrame的主要内容,如果未能解决你的问题,请参考以下文章
Pandas fillna()不适用于DataFrame切片[重复]
切片 pandas 的 MultiIndex DataFrame