2016-09-10 3 views
2

У меня есть exel-файл с именем «123.csv», который я получаю при запуске функции PROM, состоящей из двух столбцов «case» и «event». Я хочу изменить этот вывод, группируя события на основе case. Более конкретно, я хочу написать сценарий python, который будет группировать события, относящиеся к одному и тому же случаю, которые будут объединены в новую ячейку, не имеет значения, какова длина моей начальной матрицы. Может кто-нибудь, пожалуйста, дать мне некоторое представление? curent and desiret outputPython читает определенное значение ячейки в excel

import csv 

with open('123.csv', 'rb') as csvfile: 
    spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|') 
    for row in spamreader: 
     print ', '.join(row).replace(',',' ').replace('"',' ') 

это часть я написал, но он читает только файл и снимает punctiation

+0

Укажите, пожалуйста, код, который вы пытались написать до сих пор. –

+0

i m new для python, поэтому я понятия не имею, как начать с этого – Adriano10

+0

в следующий раз, пожалуйста, напишите ввод/вывод и код как текст спасибо. –

ответ

0

Это легко сделать с помощью простого CSV & defaultdict (Python 3)

Вашего вклада как

case,event 
101,A 
101,X 
101,Y 
102,B 
102,C 
103,Z 

код:

import collections 

with open("csv.csv") as f: 
    cr = csv.reader(f,delimiter=",") 

    d=collections.defaultdict(lambda : list()) 
    header=next(cr) # read title 
    for r in cr: 
     d[r[0]].append(r[1]) # fill dict 

with open("csv2.csv","w",newline="") as f: 
    cr = csv.writer(f,delimiter=",") 
    cr.writerow(header) # title 
    for k,v in d.items(): 
     cr.writerow([k,",".join(v)]) 

выход

case,event 
103,Z 
101,"A,X,Y" 
102,"B,C" 
0

Вы можете использовать GroupBy от itertools, чтобы сделать это для вас. Пример этого:

from itertools import groupby 

current = [(101, 'A'), (101, 'B'), (101, 'Y'), (102, 'C'), (102, 'D'), (102, 'U')] 
desired = [] 

for key, group in groupby(current, lambda x: x[0]): 
    lst = [element[1] for element in group] 
    grouped = (key, lst) 
    desired.append(grouped) 

print(desired) 

В основном вы даете GroupBy массив того, что у вас есть сейчас и лямбда-функции, которая принимает первый элемент массива (массив должен быть отсортирован). Groupby будет использовать первый элемент для группировки элементов.

Смежные вопросы