根据Python中的列值对一系列行求和

时间:2018-09-27 16:07:57

标签: 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 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文件中构造一个循环,该循环将根据名字(第一列)求和最后一列,例如迈克应等于130,戴夫应等于20,玛丽应等于40,简应等于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循环可以做到这一点。

谢谢

2 个答案:

答案 0 :(得分:0)

如果您愿意使用pandas,则可以省去很多体力劳动。

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

>>> from io import StringIO
>>> import pandas as pd
>>> 
>>> content = '''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'''
>>> 
>>> fake_file = StringIO(content)

解决方案

>>> 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}

答案 1 :(得分:0)

解决此问题的一种干净方法是从文件中读取每一行,并用空格分隔该行并将其存储到数组中。然后,您可以为数组索引以查找所需的特定值。

我建议您在遍历整个文件时使用dictionary存储特定名称的总和。

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

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