Поиск общих слов в Pandas фрейме данных - PullRequest
1 голос
/ 18 февраля 2020

У меня есть набор слов

{'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

Они нашли слова 'adalah' и 'pada' на большом кадре данныхPramit. Как мне найти? Может кто-нибудь может помочь? Спасибо. Любая помощь очень ценится.

Ответы [ 2 ]

2 голосов
/ 18 февраля 2020

Первое решение с 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 голос
/ 18 февраля 2020

Вот один подход, использующий sets (несколько медленнее, чем 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'}
...