在 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'。我如何找到?任何人都可以帮忙吗?谢谢。非常感谢任何帮助。
使用 set
s 和 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'}
我有套话
{'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)]
或者您可以使用 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'}