Creación de un objeto Counter () y Pandas DataFrame separados para cada lista dentro de una lista de listas

Todas las demás respuestas que pude encontrar se refieren específicamente a la agregación en todas las listas anidadas dentro de una lista de listas, donde estoy buscando agregar por separado para cada lista.

Actualmente tengo una lista de listas:

master_list = [[a,a,b,b,b,c,c,c], [d,d,d,a,a,a,c,c,c], [c,c,c,a,a,f,f,f]] 

Quiero devolver un diccionario o objetos Counter () para cada lista con un bucle:

 counter1 = {'a': 2, 'b': 3, 'c': 3} counter2 = {'d': 3, 'a': 3, 'c': 3} counter3 = {'c': 3, 'a': 2, 'f': 3} 

Actualmente, estoy devolviendo algo que se parece a esto usando un bucle. No es exactamente lo que quiero, ya que está todo agrupado y tengo problemas para acceder a los objetos del contador por separado:

 Input: count = Counter() for lists in master_list: for words in lists: count[words] += 1 Output: Counter({'a': 2, 'b': 3, 'c': 3}) Counter({'d': 3, 'a': 3, 'c': 3}) Counter({'c': 3, 'a': 2, 'f': 3}) 

El problema con lo anterior es que parece que no puedo encontrar una manera de agarrar cada Contador individualmente, porque estoy tratando de crear un dataframe de pandas para cada uno de estos diccionarios / objetos de contador. Estoy tratando de hacer esto programáticamente porque mi “master_list” tiene cientos de listas dentro de ella y quiero devolver un dataframe que muestre la frecuencia de los elementos para cada lista separada. Al final, tendría un dataframe y un objeto Counter para cada lista dentro de “master-list”

Actualmente tengo algo que devuelve solo 1 dataframe:

 Input: table = pandas.DataFrame(count.items()) table.columns = ['Word', 'Frequency'] table.sort_values(by=['Frequency'], ascending = [False]) Output: Word Frequency the 542 and 125 or 45 . . . . . . . . 

Se agradecería cualquier información, y también se agradecería cualquier consejo sobre el manejo de objetos Counter () por separado.

Puedes crear una lista y añadirle los contadores. (Además, está usando Counter , pero sigue haciendo las cuentas usted mismo, lo cual no es necesario).

 master_list = [[a,a,b,b,b,c,c,c], [d,d,d,a,a,a,c,c,c], [c,c,c,a,a,f,f,f]] counters = [] for list_ in master_list: counters.append(Counter(list_)) 

Ahora puede direccionar cada lista por separado con counters[i] .

OMI, esta pregunta puede mostrar el poder de los pandas reales. Vamos a hacer lo siguiente: en lugar de contar aburridas [a,a,b,b,b,c,c,c], [d,d,d,a,a,a,c,c,c], [c,c,c,a,a,f,f,f] contaremos la frecuencia de las palabras en libros reales. He elegido los siguientes tres: ‘Fausto’, ‘Hamlet’, ‘Macbeth’.

Código:

 #!/usr/bin/env python # -*- coding: utf-8 -*- from collections import defaultdict import string import requests import pandas as pd books = { 'Faust': 'http://www.gutenberg.org/cache/epub/2229/pg2229.txt', 'Hamlet': 'http://www.gutenberg.org/cache/epub/2265/pg2265.txt', 'Macbeth': 'http://www.gutenberg.org/cache/epub/2264/pg2264.txt', } # prepare translate table, which will remove all punctuations and digits chars2remove = list(string.punctuation + string.digits) transl_tab = str.maketrans(dict(zip(chars2remove, list(' ' * len(chars2remove))))) # replace 'carriage return' and 'new line' characters with spaces transl_tab[10] = ' ' transl_tab[13] = ' ' def tokenize(s): return s.translate(transl_tab).lower().split() def get_data(url): r = requests.get(url) if r.status_code == requests.codes.ok: return r.text else: r.raise_for_status() # generate DF containing words from books d = defaultdict(list) for name, url in books.items(): d[name] = tokenize(get_data(url)) df = pd.concat([pd.DataFrame({'book': name, 'word': tokenize(get_data(url))}) for name, url in books.items()], ignore_index=True) # let's count the frequency frequency = df.groupby(['book','word']) \ .size() \ .sort_values(ascending=False) # output print(frequency.head(30)) print('[Macbeth]: macbeth\t', frequency.loc['Macbeth', 'macbeth']) print('[Hamlet]: nay\t', frequency.loc['Hamlet', 'nay']) print('[Faust]: faust\t', frequency.loc['Faust', 'faust']) 

Salida:

 book word Hamlet the 1105 and 919 Faust und 918 Hamlet to 760 Macbeth the 759 Hamlet of 698 Faust ich 691 die 668 der 610 Macbeth and 602 Hamlet you 588 i 560 a 542 my 506 Macbeth to 460 Hamlet it 439 Macbeth of 426 Faust nicht 426 Hamlet in 409 Faust das 403 ein 399 zu 380 Hamlet that 379 Faust in 365 ist 363 Hamlet is 346 Macbeth i 344 Hamlet ham 337 this 328 not 316 dtype: int64 [Macbeth]: macbeth 67 [Hamlet]: nay 27 [Faust]: faust 272