объединение записей в Python или NumPy - PullRequest
3 голосов
/ 27 января 2012

У меня есть CSV-файл, в котором первый столбец содержит идентификатор, а второй столбец связан с данными. Идентификатор повторяется произвольное количество раз, поэтому файл выглядит следующим образом.
data1,123
data1,345
data1,432
data2,654
data2,431
data3,947
данные 3673

Я хотел бы объединить записи, чтобы сгенерировать одну запись для каждого идентификатора, и получить.
data1,123,345,432
data2,654,431
данные3,947,673

Есть ли эффективный способ сделать это на python или numpy? Словари отсутствуют из-за дублирования ключей. На данный момент у меня есть строки в списке списков, затем они циклически проходят и проверяют идентичность с предыдущим значением в индексе 0 в списке, но это очень неуклюже. Спасибо за любую помощь.

Ответы [ 3 ]

3 голосов
/ 27 января 2012

Вы можете использовать словарь, если значения являются списками.defaultdict в модуле collections очень полезен для этого.

3 голосов
/ 27 января 2012

Если все экземпляры данного значения в первом столбце являются последовательными, это идеальный вариант использования для itertools.groupby. Было бы использовано что-то вроде этого:

from itertools import groupby
from csv import reader
from operator import itemgetter

with open(filename) as f:
     for k, g in groupby(reader(f), key=itemgetter(0)):
         record = ','.join(k, *g)
         # do something with record, e.g. write to a file

(Возможно, вам придется сделать ','.join(k, *list(g)) или что-то в этом роде, сейчас я не могу это проверить)

1 голос
/ 27 января 2012

Это то, как вы можете использовать defaultdict, чтобы сделать то, что вам нужно,

import csv
from collections import defaultdict

records = defaultdict(list)
for key, value in csv.reader(open(filename)):
    records[key].append(int(value))

for key in records:
    print key, records[key]

результат,

data1 [123, 345, 432]
data3 [947, 673]
data2 [654, 431]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...