Por ejemplo, tengo un marco de datos que se ve así: Primera imagen

Y me gustaría crear un nuevo marco de datos que muestre la cantidad de veces que una palabra se marcó como spam o jamón. Quiero que se vea así: Segunda imagen

He intentado el siguiente código para hacer una lista de solo conteos de spam en una palabra para probar, pero parece que no funciona y bloquea el Kernel en Jupyter Notebook:

words = []
for word in df["Message"]:
    words.extend(word.split())

sentences = []
for word in df["Message"]:
    sentences.append(word.split())        

spam = []
ham = []

for word in words:
    sc = 0
    hc = 0
    for index,sentence in enumerate(sentences):
        if word in sentence:
            print(word)
            if(df["Category"][index])=="ham":
                hc+=1
            else:
                sc+=1
    spam.append(sc)
spam

Donde df es el marco de datos que se muestra en la Primera imagen . ¿Cómo puedo hacer esto?

0
Apple Krumble 26 abr. 2020 a las 04:08

2 respuestas

Esto sería mejor: https://docs.python.org/3.8/library/collections. html # collections.Counter

from collections import Counter
import pandas as pd

df # the data frame in your first image
df['Counter'] = df.Message.apply(lambda x: Counter(x.split()))

def func(df: pd.DataFrame):
    for category, data in df.groupby('Category'):
        count = Counter()
        for var in data.Counter:
            count += var
        cur = pd.DataFrame.from_dict(count, orient='index', columns=[category])
        yield cur

demo = func(df)
df2 = next(demo)
for cur in demo:
    df2 = df2.merge(cur, how='outer', left_index=True, right_index=True)
0
ZeFeng Zhu 26 abr. 2020 a las 04:26

Puede formar dos diccionarios spam y ham para almacenar el número de apariciones de diferentes palabras en mensajes spam / ham.

from collections import defaultdict as dd
spam = dd(int)
ham = dd(int)
for i in range(len(sentences)):
    if df['Category'][i] == 'ham':
        p = sentences[i]
        for x in p:
            ham[x] += 1
    else:
        p = sentences[i]
        for x in p:
            spam[x] += 1

La salida obtenida del código anterior para una entrada similar a la suya es la siguiente.

>>> spam
defaultdict(<class 'int'>, {'ok': 1, 'lar': 1, 'joking': 1, 'wtf': 1, 'u': 1, 'oni': 1, 'free': 1, 'entry': 1, 'in': 1, '2': 1, 'a': 1, 'wkly': 1, 'comp': 1})
>>> ham
defaultdict(<class 'int'>, {'go': 1, 'until': 1, 'jurong': 1, 'crazy': 1, 'available': 1, 'only': 1, 'in': 1, 'u': 1, 'dun': 1, 'say': 1, 's': 1, 'oearly': 1, 'nah': 1, 'I': 1, 'don’t': 1, 'think': 1, 'he': 1, 'goes': 1, 'to': 1, 'usf': 1})

Ahora puede manipular los datos y exportarlos en el formato requerido.

0
kkheelan 26 abr. 2020 a las 01:49