计算数据帧中记录之间的增量时间

时间:2016-10-03 07:47:06

标签: python pandas dataframe spark-dataframe pyspark-sql

我有一个有趣的问题,我正在尝试计算在不同位置完成的记录之间的增量时间。

OnCreateClient

我想尝试一些像

这样的东西
id x y time
1  x1 y1 10
1  x1 y1 12
1  x2 y2 14
2  x4 y4 8
2  x5 y5 12

我已经使用自定义UDTF使用HiveQL完成了这种类型的处理,但是我在考虑如何使用DataFrame来实现这一点(可能是在R,Pandas,PySpark中)。理想情况下,我正在尝试为Python pandas和pyspark找到解决方案。

感谢任何提示,感谢您的时间!

2 个答案:

答案 0 :(得分:1)

我认为您需要drop_duplicates groupby DataFrameGroupBy.diffshiftfillna

df1 = df.drop_duplicates(subset=['id','x','y']).copy()

df1['delta'] = df1.groupby(['id'])['time'].diff().shift(-1).fillna(0)

最终代码:

import pandas as pd df = pd.read_csv("sampleInput.txt", 
                                      header=None,
                                      usecols=[0,1,2,3], 
                                      names=['id','x','y','time'],
                                      sep="\t") 

delta = df.groupby(['id','x','y']).first().reset_index() 
delta['delta'] = delta.groupby('id')['time'].diff().shift(-1).fillna(0)

<强>计时

In [111]: %timeit df.groupby(['id','x','y']).first().reset_index()
100 loops, best of 3: 2.42 ms per loop

In [112]: %timeit df.drop_duplicates(subset=['id','x','y']).copy()
1000 loops, best of 3: 658 µs per loop

答案 1 :(得分:0)

@jezrael感谢您的提示,它非常有用,这里是代码

import pandas as pd
df = pd.read_csv("sampleInput.txt", header=None,usecols=[0,1,2,3], names=['id','x','y','time'],sep="\t")
delta = df.groupby(['id','x','y']).first().reset_index()
delta['delta'] = delta.groupby('id')['time'].diff().shift(-1).fillna(0)

这需要

1   x1  y1  10
1   x1  y1  12
1   x2  y2  14
2   x4  y4  8
2   x5  y5  12

并给出,

   id   x   y  time  delta
0   1  x1  y1    10      4
1   1  x2  y2    14      0
2   2  x4  y4     8      4
3   2  x5  y5    12      0