windows - Python: Hvordan kan jeg opsummere heltal i en CSV-fil, mens du kun opsummerer heltallene af en bestemt variabel?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at programmere nogle data i en csvfile ved hjælp af Python. Jeg har en liste over lande og resultater fra Eurovision Song Contest, og det ser sådan ud:


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


Et cetera.


Sammenfattende vil jeg opsummere det samlede antal point, som ethvert land modtog gennem årene, så produktionen skal se sådan ud:
'Belgien: 398', 'Hollander: 153', 'Australien: 707' og så videre.


Sådan ser min kode ud:


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)


Så jeg har allerede sørget for, at resultaterne/pointene er egentlige heltal, og jeg filtrerede ud i tredje række (År), men jeg har ingen idé om, hvordan man går videre herfra. Mange tak på forhånd!

Bedste reference


Bare læg @Mikks kommentar til et reelt svar. To linjer undtagen import


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


Det eneste ekstra, du skal gøre, er at ændre den første linje i din fil, der skal afgrænses af ; i stedet for ,.

Andre referencer 1


Jeg ændrede din kode lidt for at bruge en ordbog og brugte landnavne som nøgler. I resultatordbog d vil have landnavne som nøgle og værdi er de samlede point.


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)

Andre referencer 2


Jeg besluttede at spille lidt med din kode, og det er jeg, jeg kom med. Her indeholder row[0] landnavne, og row[1] indeholder de værdier, vi har brug for. Vi kontrollerer, om landet allerede findes i den ordbog, vi bruger til at opretholde aggregaterne, og hvis det ikke skaber vi det.


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


Hvad jeg får som output er dette


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


som jeg tror er, hvad du søgte efter.


Lad mig vide i kommentarerne, hvis du står over for et problem med at forstå noget.

Andre referencer 3


Jeg har en løsning på det. men sørg for din euro20042016.csv fil samme som


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


og denne kode får output på listen. synes godt om


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


Koden er her


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

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

    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


Jeg håber det vil hjælpe dig.