Pandas groupby:我如何使用移位值

时间:2014-08-11 22:35:56

标签: python pandas group-by

我有一个数据集,代表不同位置的重复事件。

df = [Datetime location time event]

每个位置可以有8-10个重复的事件。我要做的是建立一些信息,说明两个事件之间有多长时间。 (他们可能不是同一个事件)

我可以通过将df拆分为sub-dfs并单独处理每个位置来实现。但似乎groupby应该更聪明。这也假设我知道所有可能因文件而异的位置。

   df1 = df[(df['location'] == "Loc A")]  
   df1['delta'] = df1['time'] - df1['time'].shift(1)  

   df2 = df[(df['location'] == "Loc B")]  
   df2['delta'] = df2['time'] - df2['time'].shift(1)  
   ...

... 

我想做的是基于位置的groupBy ......

dfg = df.groupby(['location'])

然后为每个分组位置
   添加增量列
   移位和减法以获得事件之间的增量时间

问题:
groupby是否维持事件的顺序?
在DF上运行的for循环会更好吗?这似乎不是很像python。 一旦你有一个分组的df,有一种方法可以将它转换回一般的数据帧。我认为我不需要这样做,但认为将来可能会有所帮助。

感谢您提供的任何支持。

2 个答案:

答案 0 :(得分:0)

http://pandas.pydata.org/pandas-docs/dev/groupby.html看起来提供了您所需要的内容。

groups = df.groupby('location').groups

for name, group in df.groupby('location')
    // do stuff here

将其拆分为位组列中具有匹配值的行组。

然后,您可以根据时间值对组进行排序,并迭代以创建增量。

答案 1 :(得分:0)

当您分组并确定要对数据执行操作的列时,系统会返回一个函数,然后可以应用该函数。

deltaTime = lambda x: (x - x.shift(1))  
df['delta'] = df.groupby('location')['time'].apply(deltaTime)  

按位置分组并返回每个组的时间列 然后将每个子系列传递给函数deltaTime。