2017-01-18 42 views
0

我想通過使用Python在csvfile中編寫一些數據。我有一份歐洲電視網Songcontest的國家和結果清單,看起來像這樣:Python:如何將CSV文件中的整數求和,而只求和某個變量的整數?

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

Et cetera。總之,我想總結任何國家在過去幾年中得到的積分總和,所以輸出結果應該如下所示: '比利時: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

是否有任何特殊原因需要手動逐行讀取文件?這可以在'pandas'中完成:http://pandas.pydata.org/(兩行:讀取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]包含我們需要的值。我們檢查該國是否已經存在於我們用來維護聚合的詞典中,如果它不存在,我們就創建它。

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 

我得到的輸出是這

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

我相信這是你被瞄準。

如果您在理解任何問題時遇到問題,請在評論中告訴我。

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

唯一額外的事情是改變你的文件的第一行通過;而不是,分隔。

相關問題