Mam ramkę danych z tokenami jak poniżej i chcę dopasować klucze ze słownika i uzyskać odpowiedni klucz i wartość.

Ramka danych:

    A                     B
    1          ['i','like','apples', 'banana' ,'lot','however','do','not','eat','them','but' , 'sandwich'  , 'also' , 'good']
    2          ['avengers','series','something','like','most','annabelle','movies' , 'cannot' ,'watch' , 'night' , 'time']
    3          ['virat kohli','batsmen','world','like','most','federer','nadal' ,'tennis']

Mam słownik taki jak poniżej:

 key          value
apple         fruit
banana        fruit
grapes        fruit
sandwich      junkfood
noodles       junkfood
avengers      action
deadpool      action
annabelle     horror
virat kohli   cricket
federer       tennis
nadal         tennis
timo ball     table tennis

Chcę dopasować wszystkie tokeny wiersza z kluczami słownika i uzyskać dopasowane klucze i wartości, jak poniżej.

Wynik:

A              B                                     C
1       [fruit , junk food]           ['apple' , 'banana' , 'sandwich']
2       ['action' , 'horror']         ['avengers' , 'annabelle']
3       ['cricket' , 'tennis']        ['virat kohli' ,'nadal' , 'federer']
0
mukesh tech01 20 grudzień 2019, 08:00
Czego spróbowałeś do tej pory?
 – 
Klaus D.
20 grudzień 2019, 08:04
Próbowałem dopasować ciągi do słownika, ale otrzymuję błąd wartości i nie mogę ich rozwiązać, ponieważ jestem nowy w programowaniu
 – 
mukesh tech01
20 grudzień 2019, 08:17
Mam nadzieję, że możesz podać rozwiązanie, które pomogłoby mi w mojej własnej nauce
 – 
mukesh tech01
20 grudzień 2019, 08:18
Pokaż nam kod tego, czego próbowałeś.
 – 
Klaus D.
20 grudzień 2019, 08:31

1 odpowiedź

Możesz użyć pandas.DataFrame.apply wraz ze zrozumieniem listy,

#if 'df' is  your data frame  & 'dct_' is your dictionary
df['C'] = df['B'].apply(lambda lst: [item for item in lst if item in dct_.keys()])
df['D'] = df['B'].apply(lambda lst: [dct_.get(item) for item in lst if item in dct_.keys()])

  A              B                                        C                          D
0  1  [i, like, apples, banana,...]               [ banana, sandwich]          [fruit, junkfood]
1  2  [avengers, series, something,...]         [avengers, annabelle]           [action, horror]    
2  3  [virat kohli, batsmen,...]        [virat kohli, federer, nadal]  [cricket, tennis, tennis]
0
Shijith 20 grudzień 2019, 08:51
Dzięki za odpowiedź shijith, Powyższy kod działa naprawdę dobrze, jednak mam małe obawy związane z kolumną D, nie chcę mieć duplikatów jak w 3 rzędzie, tenis pokazywany wiele razy. Czy jest jakaś możliwość usunięcia z niego duplikatów
 – 
mukesh tech01
20 grudzień 2019, 09:21
Użyj set(), aby uzyskać tylko unikalne wartości, jeśli chcesz zwrócić listę, użyj list(set())tj. lambda lst: set([dct_.get(item) for item in lst if item in dct_.keys()])
 – 
Shijith
20 grudzień 2019, 09:25
Próbowałem, ale mam do czynienia z Typerror: unhashable type: numpy.ndarray dla powyższego wiersza kodu w komentarzu
 – 
mukesh tech01
20 grudzień 2019, 10:00
Użyj list(set()) zamiast lambda lst: list(set([dct_.get(item) for item in lst if item in dct_.keys()]))
 – 
Shijith
20 grudzień 2019, 10:02
Błąd pozostaje taki sam, gdy używam powyższej linii kodu!
 – 
mukesh tech01
20 grudzień 2019, 10:09