在 Pandas 数据框中查找常用词

Finding common words in Pandas dataframe

我有套话

{'adalah',
 'akan',
 'akhir',
 'algoritme',
 'alur',
 'antar',
 'antisense',
 'asam',
 'atas',
 'atau',
 'bahwa',
 'bakteriofag',
 'baru',
 'basa',
 'beranggota',
 'berdasarkan',
 'berikatan',
 'berupa',
 'pada',...}

我试图找出集合中的单词是否包含在我拥有的 bigramPMITable 数据框中

    bigram         PMI
0  (itu, adalah)   11.487338
1  (DNA, pada)     6.386371
2  (pada, oleh)    6.386371
3  (pada, basa)    1.105795
4  (yang, satu)    1.105795
5  (gula, yang)    1.044394
6  (yang, tidak)   1.044394 
7  (pada, DNA)     0.986496
8  (unting, dalam) 0.931790
9  (DNA, tidak)    0.925095
10 (DNA, menjadi)  0.925095
11 (dan, sebagai)  0.905196
12 (pada, unting)  0.834493

如果是这样,那么预期的输出将是这样的:

(itu, adalah) 11.487338
(DNA, pada) 6.386371
(pada, oleh) 6.386371
(pada, basa) 1.105795
(pada, DNA) 0.986496
(pada, unting) 0.834493

他们在 bigramPMITable 数据帧中找到了单词 'adalah' 和 'pada'。我如何找到?任何人都可以帮忙吗?谢谢。非常感谢任何帮助。

使用 sets 和 isdisjoint 的第一个解决方案,并按 boolean indexing 过滤,并按 ~:

倒掩码
df1 = df[~df.bigram.map(s.isdisjoint)]

或者您可以使用 isin:

创建助手 DataFrame
df1 = df[pd.DataFrame(df['bigram'].tolist(), index=df.index).isin(s).any(axis=1)]

print (df1)
            bigram        PMI
0    (itu, adalah)  11.487338
1      (DNA, pada)   6.386371
2     (pada, oleh)   6.386371
3     (pada, basa)   1.105795
7      (pada, DNA)   0.986496
12  (pada, unting)   0.834493

设置:

s = {'adalah',
 'akan',
 'akhir',
 'algoritme',
 'alur',
 'antar',
 'antisense',
 'asam',
 'atas',
 'atau',
 'bahwa',
 'bakteriofag',
 'baru',
 'basa',
 'beranggota',
 'berdasarkan',
 'berikatan',
 'berupa',
 'pada'}

性能:

df = pd.concat([df] * 10000, ignore_index=True)

In [41]: %timeit df[~df.bigram.map(s.isdisjoint)] 
21 ms ± 359 µs per loop (mean ± std. dev. of 7 runs, 10 loops each) 
In [42]: %timeit df[pd.DataFrame(df['bigram'].tolist(), index=df.index).isin(s).any(axis=1)] 
41.6 ms ± 5.05 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

#yatu solutions
In [43]: %timeit df[df.bigram.map(s.intersection).ne(set())] 
73.4 ms ± 4.53 ms per loop (mean ± std. dev. of 7 runs, 10 loops each) 
In [44]: %timeit df[df.bigram.map(s.intersection).str.len().gt(0)] 
127 ms ± 6.99 ms per loop (mean ± std. dev. of 7 runs, 10 loops each) 

这是一种使用 sets 的方法(比 jezrael 的 set.isdisjoint 方法慢一些):

df[df.bigram.map(s.intersection).ne(set())]

         bigram        PMI
0    (itu, adalah)  11.487338
1      (DNA, pada)   6.386371
2     (pada, oleh)   6.386371
3     (pada, basa)   1.105795
7      (pada, DNA)   0.986496
12  (pada, unting)   0.834493

其中:

s = {'adalah',
 'akan',
 'akhir',
 'algoritme',
 'alur',
 'antar',
 'antisense',
 'asam',
 'atas',
 'atau',
 'bahwa',
 'bakteriofag',
 'baru',
 'basa',
 'beranggota',
 'berdasarkan',
 'berikatan',
 'berupa',
 'pada'}