计算数据帧中记录之间的增量时间
calculating delta time between records in dataframe
我有一个有趣的问题,我正在尝试计算在不同位置完成的记录之间的增量时间。
id x y time
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
1 x1 y1 10 4
1 x2 y2 14 0
2 x4 y4 8 4
2 x5 y5 12 0
我已经通过使用自定义 UDTF 使用 HiveQL 完成了这种类型的处理,但我在考虑如何使用 DataFrame 通常实现这一点(可能在 R、Pandas、PySpark 中)。理想情况下,我正在尝试为 Python pandas 和 pyspark.
找到解决方案
感谢任何提示,感谢您的宝贵时间!
我觉得你需要drop_duplicates
with groupby
with DataFrameGroupBy.diff
, shift
and fillna
:
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
@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
我有一个有趣的问题,我正在尝试计算在不同位置完成的记录之间的增量时间。
id x y time
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
1 x1 y1 10 4
1 x2 y2 14 0
2 x4 y4 8 4
2 x5 y5 12 0
我已经通过使用自定义 UDTF 使用 HiveQL 完成了这种类型的处理,但我在考虑如何使用 DataFrame 通常实现这一点(可能在 R、Pandas、PySpark 中)。理想情况下,我正在尝试为 Python pandas 和 pyspark.
找到解决方案感谢任何提示,感谢您的宝贵时间!
我觉得你需要drop_duplicates
with groupby
with DataFrameGroupBy.diff
, shift
and fillna
:
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
@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