Pandas groupby:如何使用移位值

1 投票
2 回答
1460 浏览
提问于 2025-04-18 16:54

我有一个数据集,里面记录了不同地点上重复发生的事件。

df = [Datetime location time event]

每个地点可能会有8到10个重复的事件。我想做的是计算两个事件之间的时间间隔。(它们可能不是同一个事件)

我可以通过把数据分成几个小的数据集,然后分别处理每个地点来实现这个目标。但我觉得使用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)  
   ...

... 

我想做的是根据地点进行分组...

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

然后对于每个分组的地点
添加一个时间差列
通过移动和相减来计算事件之间的时间差

问题是:
groupby会保持事件的顺序吗?
用一个循环遍历整个数据集会更好吗?但这样似乎不太像Python的风格。
另外,一旦你有了一个分组的数据集,有没有办法把它转换回普通的数据集?我觉得我不需要这样做,但觉得将来可能会有用。

谢谢你提供的任何帮助。

2 个回答

0

看起来,当你使用分组功能并指定一个列来处理数据时,返回的结果会是一个序列,这样就可以对它应用某个函数。

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

这个例子是按地点分组,并返回每个组的时间列。
然后每个子序列会被传递给函数deltaTime。

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

这会把行分成几组,组内的行在位置这一列的值是相同的。

然后你可以根据时间的值对这些组进行排序,并逐个处理,来计算变化量。

撰写回答