删除包含数组内容的 pandas DataFrame 行
Delete pandas DataFrame rows with content from array
我有一个很大的 DataFrame(约 1 百万行),我需要根据唯一标识符 Trade_Id 删除一些行。我在另一个名为 tib 的 DataFrame 变量上有这些行的内容(在我的测试数据库中为 45000)。我的方法是这个
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]
也不行。
为了提高计算效率,有人有更好的主意吗?我还有其他像这样的数据库可以使用,我不想花两天时间来计算这个。
使用 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
我有一个很大的 DataFrame(约 1 百万行),我需要根据唯一标识符 Trade_Id 删除一些行。我在另一个名为 tib 的 DataFrame 变量上有这些行的内容(在我的测试数据库中为 45000)。我的方法是这个
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]
也不行。
为了提高计算效率,有人有更好的主意吗?我还有其他像这样的数据库可以使用,我不想花两天时间来计算这个。
使用 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