2017-07-07 139 views
3

我想用一个布尔型索引对DataFrame进行切片,获得一个副本,然后在独立于原始DataFrame的副本上进行操作。将Pandas 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 
+0

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

回答

2

您需要copyboolean indexing,新DataFrame构造函数是没有必要的:

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

警告的说明:

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

+0

这就是我正在使用的,我改变了它,因为我似乎已经在文档中读过'.copy()'不是推荐的方式,但我可能错了。 –

+0

是的,如果需要新物件需要复制。如果不需要原创的'd1 = d1 [d1.a> 1]'也应该工作。 – jezrael

相关问题