Суммирование ряда строк на основе значений столбцов в Python - PullRequest
0 голосов
/ 27 сентября 2018

Я успешно добавляю строки с помощью скрипта 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 голосов
/ 27 сентября 2018

Чистый способ решения этой проблемы - прочитать каждую строку из файла, разделить строку на пробелы и сохранить ее в массив.Затем вы можете индексировать массив для конкретных значений, которые вас интересуют.

Я бы предложил использовать 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
0 голосов
/ 27 сентября 2018

Если вы открыты для использования 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)

, не начиная со строки.

edit : стандартное решение для библиотеки:

>>> 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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...