2016-03-29 79 views
0

我可以找到的所有其他答案都特別提到在列表列表中的所有嵌套列表中進行聚合,分別彙總每個清單。爲列表列表中的每個列表創建一個單獨的Counter()對象和Pandas DataFrame

我現在有一個列表的列表:

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

我想返回字典或計數器()對象爲具有循環每個列表:

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

目前,我回國看起來像這樣使用循環的東西 - 它不完全是我想要的,因爲它都集中在一起,我無法單獨訪問櫃檯對象:

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

上面的問題是,我似乎無法找出一種方法來單獨抓取每個計數器,因爲我試圖爲這些詞典/計數器對象中的每一個創建一個熊貓數據框。我試圖通過編程來實現,因爲我的「master_list」中有數百個列表,我想返回一個數據框,顯示每個單獨列表的元素頻率。最後,我會對每個列表一個單獨的數據幀和計數器對象「主目錄」內

目前,我有東西,只返回1個數據幀:

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

任何有識之士將不勝感激 - 也,任何處理Counter()對象的提示將不勝感激。

+0

究竟你指的是? – mk8efz

回答

0

您可以創建一個列表並附加計數器。 (另外,您使用的Counter,但還在做自己的計數,這是不必要的。)

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

現在你可以解決與counters[i]每個單獨的列表。

+0

這工作,謝謝。我從來沒有意識到,字典清單是一個完美的數據結構。 – mk8efz

0

國際海事組織,這個問題可以顯示真正的熊貓的權力。讓我們做下面的事情 - 而不是計算無聊[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]我們會計算真實書籍中的單詞頻率。我選擇了以下三種:'浮士德','哈姆雷特','麥克白'。

代碼:

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

輸出:

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 
相關問題