Search code examples
pythonpandasexceptiongoogle-translation-api

Issue using a conditional statement within a Lambda function in Pandas


I am trying to translate all the columns called tweet_text in my dataset. I have about 100,000 rows of data and about 50% of that needs to be translated to English.

The following code works but I am basically running the function to translate the tweets for every single row which takes nearly 2 hours.

Note: x != " " checks if the tweets aren't empty strings as some of the tweets have just " " as I removed some of the emojis from them and that was all that was left.

Link to deep-translator

from deep_translator import GoogleTranslator
import swifter
import pandas as pd 

df_bdtu['tweet_text'] = df_bdtu.tweet_text.swifter.apply(lambda x: GoogleTranslator(source='auto', target='en').translate(x) if x != " " else None)

So in order to speed this up I tried to instead translate them only if they aren't in English as I have a column that states the language of the tweet called lang.

Here I just loop over the two columns and translate the tweet_text:

  1. If the tweet is not " "
  2. If the tweet is not in English
df_bdtu[['tweet_text', 'lang']].swifter.apply(lambda x: GoogleTranslator(source='auto', target='en').translate(x['tweet_text']) if (x['tweet_text'] != " " and x['lang'] != "en") else None, axis = 1)

But I am getting an error which sort of indicates that I am passing in all the text in one go to translate and I cannot seem to fix it. I am also open to ways to speed this up as well.

Error:

deep_translator.exceptions.NotValidPayload:  --> text must be a valid text with maximum 5000 character, otherwise it cannot be translated

Dataframe:

data = {'tweet_text': ['100 Arsenal appearances. Congratulations, Rob! ', "     Lundi soir dans l'émission ,     et   ont débriefé la victoire dans le Der...", '  È in corso la votazione tra le 4 figurine finaliste!', '   y’a absolument zéro vanne l’avis est désastreux. ', 'FINAL  1-3 ¡El   firma una gran remontada en su primera victoria de 2021!  ... ', '  JÁ HÁ ONZE!   ', 'HALF-TIME Southampton 1-0 LiverpoolDanny Ings’ brilliant early opener is the difference at the break ', "10' Une-deux parfaitement exécuté entre Tino et   Notre capitaine voit sa frappe passer au-dessus. 0-0 ", '  ¡INCREÍBLE, DOS SANTOS!          ', '   +3     '], 'lang': ['en', 'fr', 'it', 'fr', 'es', 'pt', 'en', 'fr', 'es', 'und']}
df = pd.DataFrame(data)

                                                                                               tweet_text lang
                                                          100 Arsenal appearances. Congratulations, Rob!    en
                         Lundi soir dans l'émission ,     et   ont débriefé la victoire dans le Der...   fr
                                                    È in corso la votazione tra le 4 figurine finaliste!   it
                                                      y’a absolument zéro vanne l’avis est désastreux.    fr
                          FINAL  1-3 ¡El   firma una gran remontada en su primera victoria de 2021!  ...    es
                                                                                         JÁ HÁ ONZE!      pt
    HALF-TIME Southampton 1-0 LiverpoolDanny Ings’ brilliant early opener is the difference at the break    en
10' Une-deux parfaitement exécuté entre Tino et   Notre capitaine voit sa frappe passer au-dessus. 0-0    fr
                                                                       ¡INCREÍBLE, DOS SANTOS!             es
                                                                                                  +3       und

Solution

    • The code works fine with the sample provided, so additional rows have been added to the sample dataframe, which result in exceptions.
    • Write a function, with try - except to catch the invalid rows.
    • Note that the following code does not use import swifter, because it's a module used to speed up .apply, and wasn't needed for testing.
    import pandas as pd
    from deep_translator import GoogleTranslator as GT
    from deep_translator import exceptions as excp
    
    # sample dataframe
    data = {'tweet_text': ['100 Arsenal appearances. Congratulations, Rob! ', "     Lundi soir dans l'émission ,     et   ont débriefé la victoire dans le Der...", '  È in corso la votazione tra le 4 figurine finaliste!', '   y’a absolument zéro vanne l’avis est désastreux. ', 'FINAL  1-3 ¡El   firma una gran remontada en su primera victoria de 2021!  ... ', '  JÁ HÁ ONZE!   ', 'HALF-TIME Southampton 1-0 LiverpoolDanny Ings’ brilliant early opener is the difference at the break ', "10' Une-deux parfaitement exécuté entre Tino et   Notre capitaine voit sa frappe passer au-dessus. 0-0 ", '  ¡INCREÍBLE, DOS SANTOS!          ', '   +3     ', "Quoique ce détail ne touche en aucune manière au fond même de ce que nous avons à raconter, il n'est peut-être pas inutile, ne fût-ce que pour être exact en tout, d'indiquer ici les bruits et les propos qui avaient couru sur son compte au moment où il était arrivé dans le diocèse. Vrai ou faux, ce qu'on dit des hommes tient souvent autant de place dans leur vie et surtout dans leur destinée que ce qu'ils font. M. Myriel était fils d'un conseiller au parlement d'Aix; noblesse de robe. On contait de lui que son père, le réservant pour hériter de sa charge, l'avait marié de fort bonne heure, à dix-huit ou vingt ans, suivant un usage assez répandu dans les familles parlementaires. Charles Myriel, nonobstant ce mariage, avait, disait-on, beaucoup fait parler de lui. Il était bien fait de sa personne, quoique d'assez petite taille, élégant, gracieux, spirituel; toute la première partie de sa vie avait été donnée au monde et aux galanteries. La révolution survint, les événements se précipitèrent, les familles parlementaires décimées, chassées, traquées, se dispersèrent. M. Charles Myriel, dès les premiers jours de la révolution, émigra en Italie. Sa femme y mourut d'une maladie de poitrine dont elle était atteinte depuis longtemps. Ils n'avaient point d'enfants. Que se passa-t-il ensuite dans la destinée de M. Myriel? L'écroulement de l'ancienne société française, la chute de sa propre famille, les tragiques spectacles de 93, plus effrayants encore peut-être pour les émigrés qui les voyaient de loin avec le grossissement de l'épouvante, firent-ils germer en lui des idées de renoncement et de solitude? Fut-il, au milieu d'une de ces distractions et de ces affections qui occupaient sa vie, subitement atteint d'un de ces coups mystérieux et terribles qui viennent quelquefois renverser, en le frappant au coeur, l'homme que les catastrophes publiques n'ébranleraient pas en le frappant dans son existence et dans sa fortune? Nul n'aurait pu le dire; tout ce qu'on savait, c'est que, lorsqu'il revint d'Italie, il était prêtre.Quoique ce détail ne touche en aucune manière au fond même de ce que nous avons à raconter, il n'est peut-être pas inutile, ne fût-ce que pour être exact en tout, d'indiquer ici les bruits et les propos qui avaient couru sur son compte au moment où il était arrivé dans le diocèse. Vrai ou faux, ce qu'on dit des hommes tient souvent autant de place dans leur vie et surtout dans leur destinée que ce qu'ils font. M. Myriel était fils d'un conseiller au parlement d'Aix; noblesse de robe. On contait de lui que son père, le réservant pour hériter de sa charge, l'avait marié de fort bonne heure, à dix-huit ou vingt ans, suivant un usage assez répandu dans les familles parlementaires. Charles Myriel, nonobstant ce mariage, avait, disait-on, beaucoup fait parler de lui. Il était bien fait de sa personne, quoique d'assez petite taille, élégant, gracieux, spirituel; toute la première partie de sa vie avait été donnée au monde et aux galanteries. La révolution survint, les événements se précipitèrent, les familles parlementaires décimées, chassées, traquées, se dispersèrent. M. Charles Myriel, dès les premiers jours de la révolution, émigra en Italie. Sa femme y mourut d'une maladie de poitrine dont elle était atteinte depuis longtemps. Ils n'avaient point d'enfants. Que se passa-t-il ensuite dans la destinée de M. Myriel? L'écroulement de l'ancienne société française, la chute de sa propre famille, les tragiques spectacles de 93, plus effrayants encore peut-être pour les émigrés qui les voyaient de loin avec le grossissement de l'épouvante, firent-ils germer en lui des idées de renoncement et de solitude? Fut-il, au milieu d'une de ces distractions et de ces affections qui occupaient sa vie, subitement atteint d'un de ces coups mystérieux et terribles qui viennent quelquefois renverser, en le frappant au coeur, l'homme que les catastrophes publiques n'ébranleraient pas en le frappant dans son existence et dans sa fortune? Nul n'aurait pu le dire; tout ce qu'on savait, c'est que, lorsqu'il revint d'Italie, il était prêtre.Quoique ce détail ne touche en aucune manière au fond même de ce que nous avons à raconter, il n'est peut-être pas inutile, ne fût-ce que pour être exact en tout, d'indiquer ici les bruits et les propos qui avaient couru sur son compte au moment où il était arrivé dans le diocèse. Vrai ou faux, ce qu'on dit des hommes tient souvent autant de place dans leur vie et surtout dans leur destinée que ce qu'ils font. M. Myriel était fils d'un conseiller au parlement d'Aix; noblesse de robe. On contait de lui que son père, le réservant pour hériter de sa charge, l'avait marié de fort bonne heure, à dix-huit ou vingt ans, suivant un usage assez répandu dans les familles parlementaires. Charles Myriel, nonobstant ce mariage, avait, disait-on, beaucoup fait parler de lui. Il était bien fait de sa personne, quoique d'assez petite taille, élégant, gracieux, spirituel; toute la première partie de sa vie avait été donnée au monde et aux galanteries. La révolution survint, les événements se précipitèrent, les familles parlementaires décimées, chassées, traquées, se dispersèrent. M. Charles Myriel, dès les premiers jours de la révolution, émigra en Italie. Sa femme y mourut d'une maladie de poitrine dont elle était atteinte depuis longtemps. Ils n'avaient point d'enfants. Que se passa-t-il ensuite dans la destinée de M. Myriel? L'écroulement de l'ancienne société française, la chute de sa propre famille, les tragiques spectacles de 93, plus effrayants encore peut-être pour les émigrés qui les voyaient de loin avec le grossissement de l'épouvante, firent-ils germer en lui des idées de renoncement et de solitude? Fut-il, au milieu d'une de ces distractions et de ces affections qui occupaient sa vie, subitement atteint d'un de ces coups mystérieux et terribles qui viennent quelquefois renverser, en le frappant au coeur, l'homme que les catastrophes publiques n'ébranleraient pas en le frappant dans son existence et dans sa fortune? Nul n'aurait pu le dire; tout ce qu'on savait, c'est que, lorsqu'il revint d'Italie, il était prêtre.", ['😀 😃 😄 😁 😆 😅 😂 🤣'], '😀 😃 😄 😁 😆 😅 😂 🤣'], 'lang': ['en', 'fr', 'it', 'fr', 'es', 'pt', 'en', 'fr', 'es', 'und', 'fr', 'sp', 'sp']}
    df = pd.DataFrame(data)
    
    # function to translate and catch exceptions
    def translate(x):
        try:
            v = GT(source='auto', target='en').translate(x['tweet_text']) if (x['tweet_text'] != " " and x['lang'] != "en") else x['tweet_text']
        except (excp.NotValidPayload, excp.NotValidLength) as e:
            v = f'Translation Exception: {type(e)}'
        return v
    
    
    # translate the column
    df['translated'] = df[['tweet_text', 'lang']].apply(lambda x: translate(x), axis = 1)
    
    # find rows with Translation Exception
    not_translated = df[['tweet_text', 'lang', 'translated']][df['translated'].str.startswith('Translation Exception')]