2017-10-01 2 views
0

J'ai une trame de données de pandas géants, df qui ressemble à ceci:Retour la liste de chaque mot dans une cellule de pandas géants et le nombre total de ce mot dans toute la colonne

   column1 
0 apple is a fruit 
1  fruit sucks 
2 apple tasty fruit 
3 fruits what else 
4  yup apple map 
5 fire in the hole 
6  that is true 

Je veux produire un colonne2 , qui est la liste de chaque mot dans la ligne et le nombre total de chaque mot dans la colonne entière. Donc, la sortie serait quelque chose comme ça ....

column1   column2 
0 apple is a fruit [('apple', 3),('is', 2),('a', 1),('fruit', 3)] 
1  fruit sucks [('fruit', 3),('sucks', 1)] 

J'ai essayé d'utiliser le sklearn, mais je n'ai pas réussi à atteindre ce qui précède. Besoin d'aide pour.

from sklearn.feature_extraction.text import CountVectorizer 
v = CountVectorizer() 
x = v.fit_transform(df['text']) 

Répondre

0

Voici une façon qui donne le résultat que vous voulez, bien sklearn entièrement: évite

def counts(data, column): 
    full_list = [] 
    datr = data[column].tolist() 
    total_words = " ".join(datr).split(' ') 
    # per rows 
    for i in range(len(datr)): 
     #first per row get the words 
     word_list = re.sub("[^\w]", " ", datr[i]).split() 
     #cycle per word 
     total_row = [] 
     for word in word_list: 
      count = [] 
      count = total_words.count(word) 
      val = (word, count) 
      total_row.append(val) 
     full_list.append(total_row) 
    return full_list 

df['column2'] = counts(df,'column1') 
df 
     column1         column2 
0 apple is a fruit [(apple, 3), (is, 2), (a, 1), (fruit, 3)] 
1  fruit sucks     [(fruit, 3), (sucks, 1)] 
2 apple tasty fruit  [(apple, 3), (tasty, 1), (fruit, 3)] 
3 fruits what else  [(fruits, 1), (what, 1), (else, 1)] 
4  yup apple map   [(yup, 1), (apple, 3), (map, 1)] 
5 fire in the hole [(fire, 1), (in, 1), (the, 1), (hole, 1)] 
6  that is true   [(that, 1), (is, 2), (true, 1)] 
-1

Je ne sais pas si vous pouvez le faire en utilisant scikit-learn, mais vous pouvez écrire une fonction et puis utilisez apply() pour l'appliquer sur votre DataFrame ou Series.

Voilà comment vous pouvez aller à ce sujet pour votre exemple:

test = pd.DataFrame(['apple is a fruit', 'fruit sucks', 'apple tasty fruit'], columns = ['A']) 

def a_function(row): 
    splitted_row = str(row.values[0]).split() 
    word_occurences = [] 
    for word in splitted_row: 
     column_occurences = test.A.str.count(word).sum() 
     word_occurences.append((word, column_occurences)) 
    return word_occurences 

test.apply(a_function, axis = 1) 

# Output 
0 [(apple, 2), (is, 1), (a, 4), (fruit, 3)] 
1      [(fruit, 3), (sucks, 1)] 
2   [(apple, 2), (tasty, 1), (fruit, 3)] 
dtype: object 

Comme vous pouvez le voir, le principal problème est que test.A.str.count(word) compteront les occurrences de word, où le motif attribué à word est dans le chaîne. C'est pourquoi "a" est affiché comme se produisant 4 fois. Cela devrait probablement être corrigé facilement avec certains regex (que je ne suis pas très bon).

Ou vous pouvez utiliser cette solution de contournement dans la fonction ci-dessus si vous êtes prêt à perdre quelques mots:

if word not in ['a', 'is']: # you can add here more useless words 
    word_occurences.append((word, column_occurences))