2015-09-25 95 views
1

我有一个大的DataFrame(〜1 Milion行),我需要删除一些基于唯一标识符Trade_Id的行。我在另一个名为tib的DataFrame变量中包含这行(在我的测试数据库上是45000)的内容。我的做法是这样的一个删除包含数组内容的熊猫DataFrame行

lentib=len(tib) 
for i in range(0,lentib,1): # VERY SLOW 
    dat=dat[dat.Trade_Id!=tib.Trade_Id[i]] 

但问题是,这是很慢的,做dat[dat.Trade_Id!=tib.Trade_Id]不起作用。

有人有更好的主意,以便更有效地计算?我有这样的其他数据库可以使用,我不想两天就可以计算出来。

回答

1

筛选出来使用isin和否定运算符~

dat=dat[~dat['Trade_Id']isin(tib)] 

isin会产生一个布尔面具,你可以在此使用~反转,这将删除包含的ID的

示例行:

In [127]: 
df = pd.DataFrame({'col1':np.arange(10)}) 
df 

Out[127]: 
    col1 
0  0 
1  1 
2  2 
3  3 
4  4 
5  5 
6  6 
7  7 
8  8 
9  9 

In [128]:  
df[~df['col1'].isin([2,5,8])] 

Out[128]: 
    col1 
0  0 
1  1 
3  3 
4  4 
6  6 
7  7 
9  9 

面具看起来像这样:

In [129]: 
df['col1'].isin([2,5,8]) 

Out[129]: 
0 False 
1 False 
2  True 
3 False 
4 False 
5  True 
6 False 
7 False 
8  True 
9 False 
Name: col1, dtype: bool 
+0

哦,谢谢!我确信有一些更有效的方法,但我无法找到它。它工作速度非常快。 – VCLL