我有表示过去给定节点的旅行时间的数据集。每种节点的数据都采用以下格式的CSV文件:
node name, datetime, irrelevant field, mac address
我在Pandas中将它们读入一个DataFrame:
dfs = [pd.read_csv(f, names=CSV_COLUMNS, parse_dates=[1]) for f in files]
return pd.concat(dfs)
我想要做的是找到MAC地址和#39;之间的时差。在一个节点和下一个节点出现。现在,我正在循环生成的DataFrame,这不是有效的,并且不起作用:我试图对数据进行排序的每一种方式都会导致问题。
虽然我可能能够找出排序问题,但更大的问题是我对熊猫的新手并且我打赌在Pandas中这是一个正确的方法。在处理结束时我想要的是一个数据集,显示MAC 直接在之间传输的每对节点的传输时间(timediff.total_seconds()
或类似)。最后一点很重要:对于节点为A,B和C的布局,大多数行程将是AB或BC(或反向),但有些MAC可能无法在B处注册并将进入A对于C.也有可能一些外观将是孤立的,其中MAC出现在一个节点但从未出现在另一个节点上。
答案 0 :(得分:1)
如果数据框按每个mac address
的日期时间排序,您可以这样做:
grb = df.groupby('mac address')
df['origin'] = grb['node name'].transform(pd.Series.shift, 1)
df['departure time'] = grb['datetime'].transform(pd.Series.shift, 1)
,旅行时间为:
df['travel time'] = df['departure time'] - df['datetime']
如果节点名是字符串,则路径为:
df['path'] = df['origin'] + '-' + df['node name']
编辑:假设旅行时间不能为负,这可能会更快:
df.sort(['mac address', 'datetime'], inplace=True)
df['origin'] = df['node name'].shift(1)
df['departure time'] = df['datetime'].shift(1)
# correct for the places where the mac addresses change
idx = df['mac address'] != df['mac address'].shift(1)
df.loc[idx, 'origin'] = np.nan
df.loc[idx, 'departure time'] = np.nan