2017-04-23 77 views
1

感謝您的閱讀!我對此很陌生,但昨天我開始從網站提取數據(一個項目的名稱及其相應的價格),並跳出如何使用Python 2.7爲格式創建csv文件,格式爲:price,item-name。現在我有一些數據要與它們進行比較,並獲得給定項目名稱的平均價格。我現在遇到的問題是每個網站上的項目名稱(可能)略有不同。例如我的第一數據集給出了csv文件CSV文本清理和Python比較

4.0, Jungle Book 
5.0, "Peter Pan" 
4.0, Lady and the Tramp 

第二給出

5.0, Disney's Jungle Book 
6.0, Disney's Up 
4.0, Disney's Peter Pan 

第三給出

5.0, Up (DVD) 
4.0, Peter pan (DVD) 
6.0, "Lady and the Tramp" (DVD) 

最後,我想像

平均輸出文件
4.5, Jungle Book 
5.0, Lady and the Tramp 
4.33, Peter Pan 
5.5, Up 

我的第一個問題是刪除我的csv文件中的特殊字符,如「或某些詞(如」迪士尼「,」(DVD)「)。我找到有關從csv文件中刪除行和列的信息,但是我很難在這些元素內進行編輯。像這樣的東西刪除「(DVD)」之類的作品,但讓我的CSV文件,甚至更大的混亂與更多的「和[人物..

import csv 
import string 

input_file = open('DesktopData.csv', 'r') 
output_file = open('fixformat.csv', 'w') 
data = csv.reader(input_file) 
writer = csv.writer(output_file,quoting=csv.QUOTE_ALL)# dialect='excel') 
specials = '(DVD)' 

for line in data: 
    line = str(line) 
    new_line = str.replace(line,specials,'') 
    writer.writerow(new_line.split(',')) 

input_file.close() 
output_file.close() 

一旦將工作了,我想借此均價對於給定的稱號。我心目中的東西,但缺乏Python語法真正弄明白

Read all titles and put in mainlist; 
if title already exsists, ignore/dont make new row with title 
Read all files and compare with mainlist; 
if title is found, put corresponding price in new column behind title 

在我的頭上這已經到輸出中

Jungle Book, 4.0, 5.0 
Lady and the Tramp, 4.0, 6.0 
Peter Pan, 5.0, 4.0, 4.0 
Up, 6.0, 5.0 

一旦我得到這個我敢肯定我可以做到到一般的csv文件。任何建議非常感謝!

+0

你可能想看看導入熊貓,並與它玩。從查看pd.read_csv()方法開始。 – Aklys

回答

0

到目前爲止,最難的部分就是找到相同的名稱,區別很小的區別。在這裏的解決方案中,我已經做出了一個簡單的normalize_title函數,但它並不完美。我想它需要手動調整和擴展每個新的數據集。但是,從APPART,這裏是你的問題,從多個CSV文件,連同電影標題在新的CSV文件中收集數據,然後存儲的平均成本的解決方案:

import csv 

filenames = ['first.csv', 'second.csv', 'third.csv'] 
outfile = 'avg.csv' 

removables = ['[', ']', '"', "'", "Disney's", '(DVD)'] 
def nomalize_title(title): 
    for remove in removables: 
     title = title.replace(remove, '') 
    title = title.lower() # Correct capitalization is HARD 
    return title 

moviecosts = dict() 
for filename in filenames: 
    with open(filename, 'rb') as f: 
     reader = csv.reader(f) 
     for row in reader: 
      raw_title = row[1] 
      title = normalize_title(raw_title) 
      price = float(row[0]) 

      if not moviecosts.has_key(title): 
       moviecosts[title] = [] 

      moviecosts[title].append(price) 

with open(outfile, 'wb') as f: 
    writer = csv.writer(f) 
    for movie in moviecosts: 
     avg_cost = sum(moviecosts[movie])/len(moviecosts[movie]) 
     row = [avg_cost, movie] 
     writer.writerow(row) 

可以看出,我將不同的成本存儲到列表字典中。對我而言,這似乎是手頭問題最自然的數據結構。

+0

感謝您的時間,我剛剛運行它,目前它給了我1個單元格中的1個值的輸出,這是數據庫中所有dvd的總體平均值,但這絕對有幫助。標準化後我無法找到標題列表;在哪裏可以找到'電影'中的標題? – Alex

+0

如果您只獲得一個平均值,那意味着所有標題都被「歸一化」爲相同的字符串。如果您打印moviecosts字典 – JohanL

+0

如果我打印moviecosts,它會顯示{None:[4.0,12.0,...,22.0]}所以沒有標題保存?在變量資源管理器中,我可以看到raw_title上升到最後一個數據庫的最後一個標題。而所有的數據庫價格都在moviecosts – Alex