使用Python计算一列的值之和

5

我是python的新手,我想从csv文件中读取一列数值并将其加起来,但仅限于逗号左边的数字。

我的csv文件:

Name     Code  
Angel    19;90
Eduardo  20;21
Miguel   30;45 

我希望只求出“Code”列左边的数字总和,输出结果为“19+20+30 = 69”。我尝试删除分号并将字符串转换为整数进行求和,但是得到的结果是数字连在一起的:“192030”。
Your final sum is : 1990 +2021 +3045 = 7056

预期输出是 69 还是 7056 - jezrael
1
输出为 69,@jezrael - Jacket
4个回答

5
如果需要在分号之前对值求和,请使用{{link1:Series.str.extract}}将其转换为整数,然后使用sum函数:
out = df['Code'].str.extract('(.*);', expand=False).astype('int').sum()

或者使用 Series.str.split 并通过 str[0] 选择列表的第一个值:

out = df['Code'].str.split(';').str[0].astype('int').sum()

如果需要对所有值求和,请通过使用expand=True创建DataFrame,首先按行求和,然后再使用Series函数进行求和。
out = df['Code'].str.split(';', expand=True).astype('int').sum().sum()

如果需要在没有 ; 的情况下求和,请使用 Series.str.replace

out = df['Code'].str.replace(';','', regex=True).astype('int').sum()

2
你可以这样做:

import csv

sum = 0
with open("data.csv", "r") as file:
    reader = csv.reader(file)
    next(reader) # skip header row
    for row in reader:
        code_values = row[1].split(";")
        for value in code_values:
            sum += int(value)

print(sum)

根据“split”,您可以执行任何类型的拆分逻辑。


我尝试了这段代码,但它给了我以下错误:IndexError: 列表索引超出范围。 - Jacket

1

刚刚修改了ZsoltB的回答:

import csv

sum = 0
with open("demo.csv", "r") as file:
    reader = csv.reader(file)
    next(reader) # skip header row
    for row in reader:
        code_values = row[1].split(";")
        print(code_values[0])
        sum += int(code_values[0])

print(sum)

code_values[0]将确保您仅从左列添加值。


这段代码按行获取数据,我需要按列添加。 - Jacket
你想要加上19 + 20 + 30对吧? - S M
是的 - Jacket
以上代码执行相同的操作。我创建了一个demo.csv文件并且它运行正常。 - S M

0

由于这是一个计算相关的事情,这里提供一种使用 的方法:

import numpy as np
​
d = {"left": 0, "right": 1}
choice = "left" # <- choose the position here
​
arr = np.genfromtxt("jacket.csv", delimiter=",", # <- specify a sep
                     dtype=None, skip_header=1, encoding=None)
​
left_vals = np.array([int(code.split(";")[d[choice]]) for code in arr[:,1]])
​
out = np.sum(left_vals)

输出:

print(out)
#69

嗨@Timeless,我尝试了你的代码,但是出现了这个错误:IndexError:数组的索引太多:数组是一维的,但有两个被索引。 - Jacket
现在离开一下,稍后再看;)无论如何,对于你分享的样例,代码应该可以正常工作。 - Timeless

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接