在熊猫数据框中查找常用词

时间:2020-02-18 09:22:13

标签: python pandas dataframe intersect

我有几句话

{'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”。我如何找到?谁能帮忙?谢谢。非常感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

第一个具有set s和isdisjoint的解决方案,并由boolean indexing过滤,并由~倒置屏蔽:

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

或者您可以使用DataFrame创建助手isin

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) 

答案 1 :(得分:1)

这是使用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'}