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



我通过 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 循环可以做到这一点。

谢谢

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

我建议在遍历整个文件时使用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

如果你愿意使用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}

最新更新