2017-04-23 7 views
1

読んでいただきありがとうございます!私はこれで新しくなったが、昨日私はウェブサイトからデータ(商品の名前とその価格)を抽出し始め、Python 2.7を使用して特定のウェブサイトのprice、item-nameの形式でCSVファイルを作成する方法を決めた。これで、私はそれらを比較し、与えられた項目名の平均価格を得るいくつかのデータセットを持っていました。私が今直面している問題は、アイテム名(かもしれない)が各ウェブサイトで若干異なることです。例えば、私の第一のデータセットはCSVのテキストをクリーンアップし、Pythonで比較する

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

第CSVファイル三私は

ような平均出力ファイルを希望端で

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

を与える

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

与えるを与えます

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

それが出て働くだろうしたら、私は平均的な価格をしたいです指定されたタイトルのために。私は心の中で何かを持っていますが、本当にこれが

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 

私はこれになるだろうしたら、私はかなり確信しているがouputをしなければならない私の頭では

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 

をそれを把握するためにPythonの構文が不足しています私はそれを作ることができます平均csvファイルに追加します。どんなアドバイスもありがとうございます!

+0

パンダをインポートして遊んでみてください。 pd.read_csv()メソッドを見て始めましょう。 – Aklys

答えて

0

これまでのところ、最も難しいのは、同じ名前の小さな違いを見つけることです。ここでの解決策では、簡単なnormalize_title関数を作成しましたが、それは完璧ではありません。私は手動で調整し、新しいデータセットごとに拡張する必要があると思います。図から分かるように

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) 

:しかし、それからアパートには、ここで新しいCSVファイル内のムービータイトルと一緒に平均コストを格納し、その後、いくつかのCSVファイルからデータを収集し、あなたの問題を解決するには、あります、私は異なるコストをリストの辞書に格納しています。私にとって、これは手元にある問題の最も自然なデータ構造のようです。

+0

あなたの時間をありがとう、私はそれを実行し、現時点では、それはデータベースのすべてのDVDの全体的な平均です1セルの1値の出力を与えるが、これは間違いなく有用です。正規化後のタイトルではリストが見つかりません。どこで映画の中のタイトルを見つけることができますか? – Alex

+0

平均が1つしかない場合は、すべてのタイトルが同じ文字列に「正規化」されていることを意味します。 'moviecosts' dictを印刷すると何がありますか – JohanL

+0

moviecostsを印刷すると、{None:[4.0、12.0、....、22.0]と表示されます。変数エクスプローラで、私はraw_titleが最後のデータベースの最後のタイトルに行くことがわかります。そして、データベースの価格はすべてmoviecostsにあります。 – Alex

関連する問題