2017-01-18 12 views
0

私はPythonを使用してcsvfileにいくつかのデータをプログラミングしようとしています。私はユーロビジョン・ソング・コンテストの国と結果のリストを持っており、次のようになります。Python:特定の変数の整数だけを集計しながら、CSVファイルで整数を合計するにはどうすればよいですか?

Country,Points,Year 
Belgium;181;2016 
Netherlands;153;2016 
Australia;511;2016 
Belgium;217;2015 
Australia;196;2015 

などです。

要約すると、何年にも渡って受け取った国の合計点を合計すると、出力は次のようになります: 'ベルギー:398'、 'オランダ:153'、 'オーストラリア:707'等々。

これは私のコードは次のようになります。

import csv 
with open('euro20042016.csv', 'r') as csvfile: 
    pointsallyears = [] 
    countriesallyears = [] 
    readFILE = csv.reader(csvfile, delimiter=';') 
    for row in readFILE: 
     countriesallyears.append(row[0]) 
     pointsallyears.append(row[1]) 
csvfile.close() 

results = [] 
for result in pointsallyears: 
    result = int(result) 
    results.append(result) 

scorebord = zip(countriesallyears,results) 

だから私はすでに結果/ポイントは、実際の整数であり、私は三行(年)除外が、私はどのように考えていることを確認しましたここから進んでください。ありがとうございます!

+0

ファイルを手動で1行ずつ読み込む特別な理由はありますか?これは 'pandas'でできる基本的なものです:http://pandas.pydata.org/(2行:read csvとgroupby)。 – Mikk

答えて

0

辞書を使用するようにコードを少し変更し、国名をキーとして使用しました。結果辞書dには、国名がキーとなり、値は合計ポイントとなります。

import csv 

d = dict() 

with open('euro20042016.csv', 'r') as csvfile: 
    readFILE = csv.reader(csvfile, delimiter=';') 
    print (readFILE) 
    c_list = [] 
    for row in readFILE: 
     if row[0] in c_list: 
      d[row[0]] = d[row[0]] + int(row[1]) 
     else: 
      c_list.append(row[0]) 
      d[row[0]] = int(row[1]) 
csvfile.close() 

print(d) 
+0

それは非常にうまくいった、ありがとう! –

0

あなたのコードでちょっと遊ぶことにしました。これが私が思いついたものです。ここでは、row[0]には国名が含まれ、row[1]には必要な値が含まれています。私たちは、集約を維持するために使用する辞書にその国がすでに存在するかどうかをチェックし、集計を作成しない場合は作成します。出力は、私はあなたが目指していたものであると信じて、この

{'Belgium': 398, 'Australia': 707, 'Netherlands': 153} 

であるように私は何を得る

import csv 
with open('euro20042016.csv', 'r') as csvfile: 
score_dict={} 
readFILE = csv.reader(csvfile, delimiter=';') 
for row in readFILE: 
    # Only rows with 3 elements have the data we need 
    if len(row) == 3: 
     if row[0] in score_dict: 
      score_dict[row[0]]+=int(row[1]) 
     else: 
      score_dict[row[0]]=int(row[1]) 
csvfile.close() 
print score_dict 

何かを理解する上で問題が発生した場合は、コメントにご記入ください。

0

私はそれを解決しました。 euro20042016.csvファイルが

Belgium;181;2016 
Netherlands;153;2016 
Australia;511;2016 
Belgium;217;2015 
Australia;196;2015 

と同じであることを確認してください。このコードはリストに出力されます。

[('Belgium', 398), ('Australia', 707), ('Netherlands', 153)] 

ようなコードは、私は、これはあなたを助けることを願って、ここで

try: 
    f = open('euro20042016.csv', 'r+') 
    s = f.read() 

    lst = list(map(lambda x: x.split(';'), s.split('\n'))) 

    points, country = [], [] 
    for line in lst: 
     points.append(int(line[1])) 
     country.append(line[0]) 

    countrypoints = sorted(zip(country, points), key=lambda x: x[1]) 
    country = list(set(country)) 
    total = [0]*len(country) 

    for rec in countrypoints: 
     total[country.index(rec[0])] = total[country.index(
      rec[0])] + rec[1] 
    f.close() 
    finalTotal = list(zip(country, total)) 
    print finalTotal 

except IOError as ex: 
    print ex 
except Exception as ex: 
    print ex 

です。

1

実際の回答に@Mikkのコメントを入力するだけです。あなたがする必要があるimport

import pandas as pd 
df = pd.read_csv('euro20042016.csv', sep = ';') 
print df.groupby('Country')['Points'].sum() 

だけ余分なものを除く2行は;の代わり,によって区切られるファイルの最初の行を変更することです。

関連する問題