我已成功通过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循环可以做到这一点。
谢谢
答案 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