2016-10-03 6 views
2

У меня есть интересная проблема, я пытаюсь рассчитать время дельта между записями, сделанными в разных местах.расчет дельта-времени между записями в 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 

Я сделал этот тип обработки с HiveQL с помощью пользовательских UDTF, но думал, как я могу добиться этого с DataFrame вообще (может это быть в R, Pandas, PySpark). В идеале я пытаюсь найти решение для Pandon pandas и pyspark.

Любые подсказки, спасибо за ваше время!

+0

Почему строка '1 x1 y1 12 'отсутствует в выводе? – jezrael

+0

Вам нужно 'df.groupby (['id']) ['time']. Diff()'? – jezrael

+0

Привет @jezrael строка 1 отсутствует, потому что эта запись была выполнена в том же месте, что и строка 0, я пытаюсь найти время дельты в разных местах. Я могу сделать группу только после того, как я удалю несколько записей, сделанных в каждом месте. Я всегда хочу, чтобы первая запись была сделана на месте. – suppoor

ответ

1

Я думаю, что вам нужно drop_duplicates с groupby с DataFrameGroupBy.diff, shift и 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 
+0

Я думаю быстрее используется 'drop_duplicates', я добавляю' copy', если вам нужно создать новый 'DataFrame' – jezrael

+0

Если мой ответ был полезен, не забудьте [принять] (http://meta.stackexchange.com/a/5235/295067) Это. Благодарю. – jezrael

+0

спасибо, да, это выглядит быстрее, прежде чем я столкнулся, этот код чувствителен к неупорядоченному временному полю, любые идеи по упорядочению внутри сгруппированных объектов (время w.r.t)? а затем вызовите diff() для отсортированных сгруппированных элементов. В любом случае, я должен использовать groupby id после удаления дубликатов. – suppoor

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 
Смежные вопросы