[英]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”這個詞。 我怎么找?。 任何人都可以幫忙嗎? 謝謝。 任何幫助深表感謝。
使用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)
這是使用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'}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.