【发布时间】:2016-10-03 07:47:05
【问题描述】:
我有一个有趣的问题,我正在尝试计算在不同位置完成的记录之间的增量时间。
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 找到解决方案。
感谢您的任何提示,感谢您的宝贵时间!
【问题讨论】:
-
为什么输出中缺少行
1 x1 y1 12? -
您需要
df.groupby(['id'])['time'].diff()吗? -
嗨 @jezrael 第 1 行丢失,因为此记录的完成位置与第 0 行相同,我试图在不同位置找到增量时间。只有在删除在每个位置完成的多条记录后,我才能进行分组。我总是想保留在某个位置制作的第一条记录。
-
嗯,我认为这是一个有点问题的答案,因为实际上可以有更多的行,但是你需要
df = df.drop_duplicates(subset=['id','x','y'])然后df['delta'] = df.groupby(['id'])['time'].diff().shift(-1).fillna(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)
标签: python pandas dataframe spark-dataframe pyspark-sql