基于Python中的列值对一系列行求和

基于Python中的列值对一系列行求和,python,list,for-loop,Python,List,For Loop,我正在通过Python脚本成功地将行添加到外部.txt文件,创建以下格式: Mike 200 -7 20.0 Dave 200 8 20.0 Andy 200 0 20.0 Mary 100 0 20.0 Mary 100 1 20.0 Jane 200 -7 20.0 Mike 200 -7 20.0 Fred 200 2 20.0 Malcolm 100 -26 20.0 Mike 20 -10 10.0 Mike 200 -10 20.0 Mike 200 -7 20.0 Mike 200

我正在通过Python脚本成功地将行添加到外部.txt文件,创建以下格式:

Mike 200 -7 20.0
Dave 200 8 20.0
Andy 200 0 20.0
Mary 100 0 20.0
Mary 100 1 20.0
Jane 200 -7 20.0
Mike 200 -7 20.0
Fred 200 2 20.0
Malcolm 100 -26 20.0
Mike 20 -10 10.0
Mike 200 -10 20.0
Mike 200 -7 20.0
Mike 200 2 20.0
Fred 100 19 20.0
Mike 200 -19 20.0
Jane 200 -7 20.0
Jane 100 -26 20.0
Malcolm 200 -15 20.0
我现在需要在我的主python文件中构造一个循环,该循环将根据名字(第一列)对最后一列求和,例如Mike应该等于130,Dave应该等于20,Mary应该等于40,Jane应该等于60等等

为了解决这个问题,我想我应该先手动测试一个名字(使用
v
),并且已经做到了这一点

vol_amount = ""
with open("MyTest.txt", "r") as vol:
    for v in vol:
        v = "Mike"
        for s in v[0]:
            vol_amount += int(s[3])

print(vol_amount)
我似乎无法超越这一点

有没有人能给出一些指针,说明我的for循环应该是什么,从而依次遍历每个名称,并从第四列中总结它们的值?理想情况下不使用熊猫或任何附加组件

我相信for循环可以做到这一点


谢谢

如果你愿意使用熊猫,你可以摆脱大量的体力劳动

设置(您可以跳过此步骤,并在下一步中将实际文件的名称传递给
read\u csv

解决方案

>>> df = pd.read_csv(fake_file, header=None, delim_whitespace=True)
>>> df.groupby(0)[3].sum()
0
Andy        20.0
Dave        20.0
Fred        40.0
Jane        60.0
Malcolm     40.0
Mary        40.0
Mike       130.0
Name: 3, dtype: float64
在这里,您可以使用

df = pd.read_csv(YOUR_FILENAME_HERE, header=None, delim_whitespace=True)
当不是从字符串开始时

编辑:标准库解决方案:

>>> from operator import itemgetter
>>> from itertools import groupby
>>> 
>>> rows = sorted(line.split() for line in fake_file)
>>> grouper = groupby(rows, key=itemgetter(0))
>>> {name: sum(float(list(lst)[-1]) for lst in lists) for name, lists in grouper}
{'Malcolm': 40.0, 'Andy': 20.0, 'Fred': 40.0, 'Mary': 40.0, 'Mike': 130.0, 'Jane': 60.0, 'Dave': 20.0}

解决此问题的一种干净方法是从文件中读取每一行,并将该行按空格分割,然后将其存储到数组中。然后可以为数组编制感兴趣的特定值的索引

我建议在遍历整个文件时,使用
字典
存储特定名称的总和

这是您试图完成的工作代码示例:

store = {}
with open('data.txt') as my_file:
    for line in my_file:
        values = line[:-1].split(" ")
        if values[0] not in store:
            store[values[0]] = float(values[3])
        else:
            store[values[0]] += float(values[3])
现在,如果您对特定名称的值感兴趣,可以在字典中搜索该名称:

print(store['Mike']) # output is 130.0
print(store['Mary']) # output is 40.0
print(store['Dave']) # output is 20.0

v[0]中的s在这种情况下将始终为Mdon。不要将v设置为任何值,v应为一行。。你可以在空白处分割它,然后你可以做[0]来得到第一列你是对的-这是我测试的一部分。我把这个改回了volu amountmad.meesh你能告诉我你的意思吗。我现在删除了
v=“mike”
,它返回了
vol\u amount+=int(s[3])索引器:字符串索引超出范围
谢谢-但最好不要使用熊猫。有没有办法不使用这样的库?@user9099702添加了一个没有熊猫的解决方案。非常感谢。理想情况下,这将是一种完全干净的实现方法,没有导入或其他库。@user9099702认为使用标准库是“不干净”的想法让我感到奇怪,但至少您现在有三种替代解决方案。非常感谢你。真的很有帮助!没问题!使用像pandas这样的图书馆会让你的生活更轻松,但我知道这可能是你的项目限制。
print(store['Mike']) # output is 130.0
print(store['Mary']) # output is 40.0
print(store['Dave']) # output is 20.0