CSV группировка без панд - PullRequest
1 голос
/ 03 июля 2019

Я бы хотел сгруппировать данные в файл .csv. Мои данные похожи на следующие:

code,balance
CN,999.99
CN,1.01
LS,177.77
LS,69.42
LA,200.43
WO,100

Я хотел бы сгруппировать элементы по коду и суммировать остатки подобных кодов. Желаемый результат будет:

code,blance
CN,1001
LS,247.19
...

Первоначально я использовал Pandas для этой задачи, но у меня не было пакета, доступного для размещения этой библиотеки на сервере.

mydata = pd.read_csv('./tmp/temp.csv')
out = mydata.groupby('code').sum()

Решения предпочтительно должны быть совместимы с Python 2.6. Я извиняюсь, если это дубликат, другие посты, кажется, группируются по-другому.

Я также хотел бы избежать этого в -

if code = x
    add balance to x_total

- путь

МОЕ РЕШЕНИЕ:

def groupit():
    groups = defaultdict(list)
    with open('tmp.csv') as fd:
        reader = csv.DictReader(fd)
        for row in reader:
            groups[row['code']].append(float(row['balance.']))
    total={key:sum(groups[key]) for key in groups}
    total=str(total)
    total=total.replace(' ','')
    total=total.replace('{','')
    total=total.replace('}','')
    total=total.replace("'",'')
    total=total.replace(',','\n')
    total=total.replace(':',',')

    outfile = open('out.csv','w+')
    outfile.write('code,balance\n')
    outfile.write(total)

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

Python> 2.6:

from collections import defaultdict
import csv

groups = defaultdict(list)
with open('text.txt') as fd:
    reader = csv.DictReader(fd)
    for row in reader:
        groups[row['code']].append(float(row['balance']))

totals = {key: sum(groups[key]) for key in groups}
print(totals)

Это выводит:

{'CN': 1001.0, 'LS': 247.19, 'LA': 200.43, 'WO': 100.0}

Python = 2.6:

from collections import defaultdict
import csv

groups = defaultdict(list)
with open('text.txt') as fd:
    reader = csv.DictReader(fd)
    for row in reader:
        groups[row['code']].append(float(row['balance']))

totals = dict((key, sum(groups[key])) for key in groups)
print(totals)
1 голос
/ 03 июля 2019

Вот как я это сделаю:

with open("data.csv", 'r') as f:
data = f.readlines()

result = {}
for val in range(1, len(data)-1):
    x = data[val].split(",")
    if x[0] not in result:
        result[x[0]] = float(x[1].replace('\n', ""))
    else:
        result[x[0]] = result[x[0]] + float(x[1].replace('\n', ""))

result словарь будет иметь значения, которые могут быть сохранены как CSV.

import csv

with open('mycsvfile.csv', 'wb') as f:  # Just use 'w' mode in 3.x
    w = csv.DictWriter(f, result.keys())
    w.writeheader()
    w.writerow(result)

Надеюсь, это поможет:)

...