Pandas汇总特定列中的所有行

时间:2017-04-10 13:40:24

标签: python csv pandas

我的CSV输入如下:

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

现在我想要一个像这样的输出:

 Total:     
  User1   11        01-31.01.2017  

但我明白了 2,553,5
我不能说为什么我测试了这么多例子,但总是输出相同的。

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

4 个答案:

答案 0 :(得分:2)

您可以先在read_csv中使用decimal=","参数删除浮点数中的,

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

答案 1 :(得分:0)

你的小数是使用逗号','的原因。

hours
2,5  
5  
3,5 

当我尝试时,我得到了和你一样的答案。将其更改为十进制,即点'。'。喜欢这个

hours
2.5  
5  
3.5 

瞧!你得到了答案。

以下是工作示例。

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

答案 2 :(得分:0)

首先将hours列转换为float64的dtype。这可以通过以下方式完成:

import pandas as pd
import numpy as np

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

接下来,您可以使用函数返回所需的df行。

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'])

答案 3 :(得分:-1)

试试这个: 所以你可以总结一下例如第二行的小时

   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)