Python 熊猫客户表>&燃气轮机;将边添加到节点列和增量

Python 熊猫客户表>&燃气轮机;将边添加到节点列和增量,python,pandas,timedelta,Python,Pandas,Timedelta,我有一个数据表,我想创建一个图表。(请参见末尾粘贴的数据示例) 为此,我想创建节点和边。 每个客户端都会经历不同的进程状态。 边连接两个状态(节点) 我的目标是获得excel表格屏幕截图中显示的边缘以及每次更改的增量时间 我的代码: 首先,我按照客户机和时间戳对表进行排序(即节点(状态)从t1到t2到t3…其中t1 estados=estados.sort_values(['CLIENT', 'timestamp'], ascending=[True, True]) 下面是20%的python

我有一个数据表,我想创建一个图表。(请参见末尾粘贴的数据示例) 为此,我想创建节点和边。 每个客户端都会经历不同的进程状态。 边连接两个状态(节点) 我的目标是获得excel表格屏幕截图中显示的边缘以及每次更改的增量时间

我的代码: 首先,我按照客户机和时间戳对表进行排序(即节点(状态)从t1到t2到t3…其中t1
estados=estados.sort_values(['CLIENT', 'timestamp'], ascending=[True, True])
下面是20%的pythonic代码和0%的pandonic代码:

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
这段代码可以工作,但还远远不够理想。 这应该是一个非常常见的问题。我需要一个更高效的代码,因为我有50万行,它应该在合理的时间内运行

我正在寻找一个函数来创建列的边缘和时间戳 我不能得出这样的解决方案,因为函数引用的是两个不同行中的值,而不仅仅是ony,在这种情况下,我可以做如下操作

estados['edge'] = estados['node'].apply(function)
因为我必须传递两个值,而不是一个

有没有不使用for循环的方法

thx

该表的格式为:

注1:复制和粘贴JSON文件:{“客户端”:{“0”:“客户端1”,“1”:“客户端1”,“2”:“客户端1”,“3”:“客户端1”,“4”:“客户端2”,“5”:“客户端2”,“6”:“客户端2”,“7”:“客户端3”,“8”:“客户端4”,“9”:“客户端4”,“10”:“客户端4”,“11”:“客户端4”,“12”:“客户端4”,“13”:“客户端4”},“节点”:“0”:“A”,“1”:“B”,“2”:“C”,“3”:“H”,“4”:“B”,“5”和“F”,“7”,“9”:“F”,“10”:“F”:“E”:,“11”:“H”,“12”:“G”,“13”:“K”},“时间戳”:{“0”:1590684862000,“1”:1590771262270,“2”:1590857662000,“3”:1590598462000,“4”:1590425662000,“5”:1590512062000,“6”:1590598462000,“7”:1590771262270,“8”:15883522062000,“9”:1588524862000,“10”:1588611262000,“11”:15888697662000,“12”:15889562000,“13”:1589043262000}

您可以在这里使用


太棒了。很好用。我正在尝试对deltatime.df.groupby('CLIENT')使用shift。timestamp.shift(1)。substract(df.timestamp)不起作用……@Berlines使用
df.groupby('CLIENT')。timestamp.shift(1)。sub(df.timestamp)
当使用df.groupby('CLIENT')。timestamp.shift(1)。sub(df.timestamp)Deltatime是负数。为什么从第一个事件到最后一个事件排序?这里的解决方案是:df.groupby('CLIENT').timestamp.shift(-1).sub(df.timestamp)
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