pandas таблица клиентов >> добавить ребра в столбец узлов и дельт. - PullRequest
0 голосов
/ 29 мая 2020

У меня есть таблица данных. Я хочу построить график. (см. пример данных для вставки в конце) Для этого я хотел бы создать узлы и края. У каждого клиента go разные состояния процесса. Ребра соединяют два состояния (узла). Моя цель - получить ребра, как показано на скриншоте таблицы Excel, и дельта-время каждого изменения времени.

Мой код: Сначала я отсортировал таблицу по клиенту и по метке времени (т.е. узлы (состояния) go от t1 до t2 до t3 ... где t1

estados=estados.sort_values(['CLIENT', 'timestamp'], ascending=[True, True])

И теперь следует код 20% pythoni c и код 0% pandoni c:

edges_column = []
delta_column = []
for client in list_of_clients:
    client_df = estados.loc[estados['CLIENT'] == client,['node','timestamp']]
    client_nodes      = client_df['node']
    client_timestamps = client_df['timestamp']
    list_edges        = [node1 + '-' + node2 for node1,node2 in  zip(client_nodes[:-1],client_nodes[1:])]
    list_delta_times  = [t2 -t1 for t1,t2 in  zip(client_timestamps[:-1],client_timestamps[1:])]
    print(list_edges)
    print(list_delta_times)
    # adding ['-'] because if there are n nodes there are n-1 edges. the same for delta times
    edges_column = edges_column + list_edges + ['-']
    delta_column = delta_column + list_delta_times + ['-']

# adding the columns edges_column and delta_column
print(len(edges_column))
estados['edge']      = edges_column
estados['deltatime'] = delta_column

Этот код работает, но он далек от идеала. Это должно быть довольно распространенной проблемой. Мне нужен более эффективный код, потому что у меня полмиллиона строк, и он должен выполняться в разумные сроки.

Я ищу функцию для создания края столбцов и метки времени. Я не могу прийти к такому решению, потому что функция относится к значениям из двух разных строк, а не только к одному, в таком случае я мог бы сделать что-то вроде

estados['edge'] = estados['node'].apply(function)

потому что мне нужно передать два значения, а не одно.

Есть ли вообще способ без использования циклов for?

thx.

enter image description here

т таблица имеет формат pandas:

ПРИМЕЧАНИЕ1 для копирования и вставки JSON файл: {"КЛИЕНТ": {"0": "client1", "1": "client1", "2" : "client1", "3": "client1", "4": "client2", "5": "client2", "6": "client2", "7": "client3", "8": " client4 "," 9 ":" client4 "," 10 ":" client4 "," 11 ":" client4 "," 12 ":" client4 "," 13 ":" client4 "}," node ": {" 0 »:« A »,« 1 »:« B »,« 2 »:« C »,« 3 »:« H »,« 4 »:« B »,« 5 »:« F »,« 6 »:« G »,« 7 »:« C »,« 8 »:« D »,« 9 »:« E »,« 10 »:« F »,« 11 »:« H »,« 12 ":" G "," 13 ":" K "}," timestamp ": {" 0 ": 1590684862000," 1 ": 1590771262270," 2 ": 1590857662000," 3 ": 1590598462000," 4 ": 1590425662000 , «5»: 1590512062000, «6»: 1590598462000, «7»: 1590771262270, «8»: 1588352062000, «9»: 1588524862000, «10»: 1588611262000, «11»: 1588697662000, «12»: 1588956862000, « 13 ": 1589043262000}}

1 Ответ

1 голос
/ 29 мая 2020

Вы можете использовать df.shift с pd.Series.str.cat здесь.

df['result'] = df.groupby('CLIENT').node.shift(1).str.cat(df.node,'-')
df

     CLIENT node      timestamp result
0   client1    A  1590684862000    NaN
1   client1    B  1590771262270    A-B
2   client1    C  1590857662000    B-C
3   client1    H  1590598462000    C-H
4   client2    B  1590425662000    NaN
5   client2    F  1590512062000    B-F
6   client2    G  1590598462000    F-G
7   client3    C  1590771262270    NaN
8   client4    D  1588352062000    NaN
9   client4    E  1588524862000    D-E
10  client4    F  1588611262000    E-F
11  client4    H  1588697662000    F-H
12  client4    G  1588956862000    H-G
13  client4    K  1589043262000    G-K
...