2017-04-10 2 views
2

Ich habe eine CSV mit einem Eingang wie folgt aus:Pandas Summe alle Zeilen in bestimmten Columne

Name  hours  Date 
User1 2,5  01.01.2017 
User1 5   02.01.2017 
... 
User1 3,5  31.01.2017 

Und nun möchte ich eine Ausgabe wie folgt aus:

Total:  
    User1 11  01-31.01.2017 

Aber ich bekomme diese 2553, 5
Ich kann nicht sagen, warum ich so viele Beispiele getestet habe, aber immer die gleiche Ausgabe.

print(df["hours"].sum()) 
+0

ist nur ein 'User1' oder mehrere wie' User2', 'User3' ...? – jezrael

+0

Nur ein Benutzer. Ich filterte den anderen raus. – Kenny

+0

Sind 'Datum' sortiert? – jezrael

Antwort

2

können Sie decimal="," Parameter verwenden, zuerst in read_csv für entfernen , in Schwimmern.

cols = ['Name','Sum', 'Dates'] 
a = pd.DataFrame([[df["Name"].iat[0], 
        df["hours"].sum(), 
        df["Date"].min().strftime('%d.%m.%Y') + '-' + 
        df["Date"].max().strftime('%d.%m.%Y')]], columns=cols) 
print (a) 
    Name Sum     Dates 
0 User1 11.0 01.01.2017-01.02.2017 
+0

Leider gibt es immer noch 2.553,5 und keine echte Summe. Aber Datum funktioniert :) – Kenny

+1

Haben Sie 'Dezimal' Parameter in read_csv? – jezrael

+0

delimiter = '\ t', error_bad_lines = Falsch, header = 4, encoding = 'cp1252', kommentar = '-', parse_dates = [3], converters = {"hours": int}). – Kenny

-1

versuchen mit diesem: so können Sie die zweite Zeile mit Stunden zum Beispiel Summe

with open("nameofyourfile.csv") as fin: 
     total = 0 
     for row in csv.reader(fin): 
      total += int(row[0]) # this will sum the first row     
    print(total) 
+0

das Problem ist, dass die Floats Kommas anstelle von Punkten für die Dezimalstelle verwenden, so dass Python sie als Strings interpretiert und sie eher contrating als hinzufügen - ich don nicht sehen, wie das das lösen würde. – Stael

+0

Ja. Sie haben Recht. Vielleicht mit Regex ist es möglich, die Kommas in Punkte zu ändern? – kpl33

0

Der Grund, warum Ihr Komma verwendet ‚‘.

hours 
2,5 
5 
3,5 

Wenn ich versuche, habe ich die gleiche Antwort wie Sie. Nach dem Ändern in Dezimal, was Punkt '.' Ist. Gefällt mir

hours 
2.5 
5 
3.5 

Voila! Du bekommst die Antwort.

Unten ist das Arbeitsbeispiel.

import pandas as pd 

info = {'User':['User1','User1','User1'], 
     'Value':[3.5,2.5,5], 
     'Date':['01.01.2017','03.01.2017','02.01.2017']} 
df = pd.DataFrame(info) 
print(df['Value'].sum()) 
0

zuerst Ihre hours Spalte zu einer dtype von float64 konvertieren. Dies kann erfolgen mit:

import pandas as pd 
import numpy as np 

df['hours'] = df.hours.apply(lambda x: x.replace(',', '.')).astype(np.float64) 

Als nächstes können Sie eine Funktion verwenden, um die gewünschte df-Zeile zurückzugeben.

def totals_by_user(df, username): 
    # Sort by username 
    df = df.loc[df.Name == username] 

    # Get the total hours 
    tot_hours = df.hours.sum() 

    # Finds the date range in your format 
    df = df.sort('Date') 
    date_range = df.Date.min().split('.')[0] + '-' + df.Date.max() 

    return pd.DataFrame([username, tot_hours, date_range], columns = ['Name', 'Sum', 'Date']) 
Verwandte Themen