2009-11-18 2 views
0

У меня есть набор данных, подобный этому:Как объединить дубликаты в 2D питона массивов

# Start_Time End_Time  Call_Type Info 
1 13:14:37.236 13:14:53.700 Ping1  RTT(Avr):160ms 
2 13:14:58.955 13:15:29.984 Ping2  RTT(Avr):40ms 
3 13:19:12.754 13:19:14.757 Ping3_1 RTT(Avr):620ms 
3 13:19:12.754    Ping3_2 RTT(Avr):210ms 
4 13:14:58.955 13:15:29.984 Ping4  RTT(Avr):360ms 
5 13:19:12.754 13:19:14.757 Ping1  RTT(Avr):40ms 
6 13:19:59.862 13:20:01.522 Ping2  RTT(Avr):163ms 
... 

Когда я анализирую через него, мне нужно объединить результаты Ping3_1 и Ping3_2, взять среднее из тех, два ряда, а также экспорт, что в один ряд, так что в конце результата будет выглядеть так:

# Start_Time End_Time  Call_Type Info 
1 13:14:37.236 13:14:53.700 Ping1  RTT(Avr):160ms 
2 13:14:58.955 13:15:29.984 Ping2  RTT(Avr):40ms 
3 13:19:12.754 13:19:14.757 Ping3  RTT(Avr):415ms 
4 13:14:58.955 13:15:29.984 Ping4  RTT(Avr):360ms 
5 13:19:12.754 13:19:14.757 Ping1  RTT(Avr):40ms 
6 13:19:59.862 13:20:01.522 Ping2  RTT(Avr):163ms 
... 

в настоящее время я конкатенации колонки 0 и 1, чтобы сделать уникальный ключ, находя дублирования там, то делает остальное специальное лечение для этих параллельных пинов. Это не элегантно. Просто задайтесь вопросом, что лучше для этого. Благодаря!

+2

Являются ли дубликаты всегда на соседних строках? –

ответ

0

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

def average_pings(ping1, ping2): 
    pass 

def merge_pings(seq): 
    prev_key=prev_key=None 
    for item in seq: 
     key = item.split()[:2] 
     if key == prev_key: 
      yield average_pings(prev_item, item) 
     else: 
      yield item 
     prev_key=key 
     prev_item=item 
0

Я не уверен, о том, как ваши данные структурированы, поэтому я предполагаю, что список dicts для целей утка опечаток.

Я также предполагаю, что основным первичным ключом вашего набора данных является «Пуск».

for i in range(len(dataset)-1): 
    #Detect duplicates, assuming they are sorted properly 
    if dataset[i]["Start"] == dataset[i+1]["Start"]: 
    #Merge 'em 
    dataset[i+1] = merge(dataset[i], dataset[i+1]) 

    #Deleting items from the array you are iterating over is a bad idea 
    dataset[i] = None 

dataset = [item for item in dataset if item != None] #so just delete them later 

... где merge будет функцией, которая фактически выполняет слияние.

Не элегантный, C-ish, но, вероятно, лучше, чем вы в настоящее время используете.

Они не отсортированы?

dataset.sort((lambda x,y: return cmp(x["Start"],y["Start"]))) 

Теперь они должны быть.

+0

Никогда не используйте cmp для сортировки. он медленнее. используйте ключ: 'dataset.sort (key = operator.itemgetter ('Start'))' – nosklo

+0

Ну, я думаю, у меня не будет выбора с Py3k во всяком случае. – badp

1

Если предположить, что дублирует примыкают (как они показаны на ваш вопрос), itertools.groupby является идеальным способом, чтобы идентифицировать их как дубликаты (с небольшой помощью от operator.itemgetter извлечь «ключ», определяющую личность. Предполагая, что у вас есть список объектов (пинги) с атрибутами, такими как .start и .end:

import itertools 
import operator 

def merge(listofpings): 
    k = operator.itemgetter('start', 'end') 
    for i, grp in itertools.groupby(listofpings, key=k): 
    lst = list(grp) 
    if len(lst) > 2: 
     item = mergepings(lst) 
    else: 
     item = lst[0] 
    emitping(i, item) 

если вы уже имеют функции mergepings сливаться список> 1 «дублировать» свистит, и emitping испускать пронумерованный пинг (голый или объединены).

Если listofpings еще не отсортированы правильно, просто добавьте listofpings.sort(key=k) непосредственно перед циклом for (предположительно, в порядке сортировки в порядке, справа?).

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