我通过 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}