将Pandas DataFrame切片成一个新的DataFrame

17
我希望能够使用布尔索引来切片DataFrame,并获得一份副本,然后对该副本进行操作而不影响原始的DataFrame。
答案中可以看出,使用Boolean数组进行选择并使用.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 - ayhan
DataFrame.is_copy 已经不再在API中。 - Rich Andrews
1个回答

25
您需要使用复制布尔索引,无需使用新的DataFrame构造函数:
d2 = d1[d1.a > 1].copy()

警告的解释:

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


那是我之前使用的方法,我改了它,因为我在文档中看到 .copy() 不是推荐的方式,但我可能错了。 - Pietro Marchesi
是的,如果需要新对象,则需要复制。如果不需要,则原始的 d1 = d1[d1.a > 1] 也可以工作。 - jezrael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接