Pandas groupby:如何使用移位值
我有一个数据集,里面记录了不同地点上重复发生的事件。
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
这会把行分成几组,组内的行在位置这一列的值是相同的。
然后你可以根据时间的值对这些组进行排序,并逐个处理,来计算变化量。