J'ai un Pandas Dataframe qui a les valeurs de colonne comme liste de chaînes. Chaque liste peut avoir une ou plusieurs chaînes. Pour les chaînes qui ont plus d'un mot, je voudrais les diviser en mots individuels, afin que chaque liste ne contienne que des mots individuels. Dans le Dataframe suivant, seule la colonne sent_tags contient des listes qui contiennent des chaînes de longueur variable.

DataFrame :

import pandas as pd    
pd.set_option('display.max_colwidth', -1)
df = pd.DataFrame({"fruit_tags": [["'apples'", "'oranges'", "'pears'"], ["'melons'", "'peaches'", "'kiwis'"]], "sent_tags":[["'apples'", "'sweeter than oranges'", "'pears sweeter than apples'"], ["'melons'", "'sweeter than peaches'", "'kiwis sweeter than melons'"]]})
print(df)  

    fruit_tags                        sent_tags
0   ['apples', 'oranges', 'pears']  ['apples', 'sweeter than oranges', 'pears sweeter than apples']
1   ['melons', 'peaches', 'kiwis']  ['melons', 'sweeter than peaches', 'kiwis sweeter than melons']

Ma tentative :

J'ai décidé d'utiliser word_tokenize de la bibliothèque NLTK pour diviser ces chaînes en mots individuels. J'obtiens les mots symbolisés pour une sélection particulière dans la liste, mais je ne peux pas les regrouper dans chaque liste pour chaque ligne:

from nltk.tokenize import word_tokenize
df['sent_tags'].str[1].str.strip("'").apply(lambda x:word_tokenize(x.lower()))
#Output
0    [sweeter, than, oranges]
1    [sweeter, than, peaches]
Name: sent_tags, dtype: object

Résultat souhaité :

    fruit_tags                        sent_tags
0   ['apples', 'oranges', 'pears']  ['apples', 'sweeter', 'than', 'oranges', 'pears', 'sweeter', 'than', 'apples']
1   ['melons', 'peaches', 'kiwis']  ['melons', 'sweeter', 'than', 'peaches', 'kiwis', 'sweeter', 'than', 'melons']
2
amanb 18 mars 2019 à 14:35

2 réponses

Meilleure réponse

Utilisez la compréhension de liste avec l'aplatissement avec toutes les fonctions de texte - strip, lower et split:

s = df['sent_tags'].apply(lambda x: [z for y in x for z in y.strip("'").lower().split()])

Ou:

s = [[z for y in x for z in y.strip("'").lower().split()] for x in df['sent_tags']]

df['sent_tags'] = s

print(df) 
                       fruit_tags  \
0  ['apples', 'oranges', 'pears']   
1  ['melons', 'peaches', 'kiwis']   

                                                        sent_tags  
0  [apples, sweeter, than, oranges, pears, sweeter, than, apples]  
1  [melons, sweeter, than, peaches, kiwis, sweeter, than, melons]  
3
jezrael 18 mars 2019 à 11:42

Une autre méthode possible pourrait être:

df['sent_tags'].apply(lambda x: [item for elem in [y.split() for y in x] for item in elem])
0
Loochie 18 mars 2019 à 12:17