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