基于Python中的列值对一系列行求和
我正在通过Python脚本成功地将行添加到外部.txt文件,创建以下格式:基于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
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