2016-03-29 7 views
0

Alle anderen Antworten, die ich finden konnte, bezogen sich auf alle verschachtelten Listen innerhalb einer Liste von Listen, wo ich nachsehen für jede Liste getrennt aggregieren.Erstellen eines separaten Counter() - Objekts und Pandas DataFrame für jede Liste in einer Liste von Listen

Im Moment habe ich eine Liste von Listen:

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]] 

Ich möchte ein Wörterbuch oder Zähler zurück() Objekte für jede Liste mit einer Schleife:

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

Derzeit bin ich Rückkehr etwas, das mit einer Schleife wie folgt aussieht - es ist nicht genau das, was ich will, da es alles zusammengewürfelt ist und ich Probleme beim separaten Zugriff auf die Zählerobjekte habe:

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}) 

Das Problem mit dem Obengenannten ist, dass ich nicht scheinen kann, einen Weg zu finden, jeden Counter einzeln zu ergreifen, weil ich versuche, einen pandas Datenrahmen für jedes dieser Wörterbücher/Gegenobjekte zu schaffen. Ich versuche das programmatisch zu tun, weil meine "master_list" Hunderte von Listen enthält und ich möchte einen Datenrahmen zurückgeben, der die Häufigkeit der Elemente für jede einzelne Liste anzeigt. Am Ende würde ich für jede Liste einen separaten Datenrahmen und Counter-Objekt hat in „Master-Liste“

Zur Zeit habe ich etwas, das nur 1 Datenrahmen zurück:

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 
.  . 
.  . 
.  . 
.  . 

Einsicht würde geschätzt - auch, Tipps zur separaten Behandlung von Counter() - Objekten sind willkommen.

+0

was genau meinen Sie? – mk8efz

Antwort

0

Sie können eine Liste erstellen und die Zähler anhängen. (Auch Sie verwenden Counter, aber immer noch die Zählungen selbst zu tun, was nicht notwendig ist.)

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_)) 

Jetzt können Sie mit counters[i] jede einzelne Liste adressieren.

+0

Das hat funktioniert, danke. Ich habe nie realisiert, dass eine Liste von Wörterbüchern eine vollkommen gute Datenstruktur ist. – mk8efz

0

IMO, diese Frage kann die wahre Pandas Kraft zeigen. Lassen Sie uns folgendes tun - anstatt langweilig zu zählen [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] werden wir die Häufigkeit der Wörter in echten Büchern zählen. Ich habe die folgenden drei ausgewählt: 'Faust', 'Hamlet', 'Macbeth'.

Code:

#!/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']) 

Ausgang:

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 
Verwandte Themen