【发布时间】:2014-01-06 01:16:12
【问题描述】:
假设我有一个包含 3 列的数据框:Date、Ticker、Value(没有索引,至少开始时)。我有很多日期和很多代码,但每个 (ticker, date) 元组都是独一无二的。 (但很明显,相同的日期会出现在很多行中,因为它会出现在多个代码中,而同一个代码会出现在多个行中,因为它会出现很多日期。)
最初,我的行按特定顺序排列,但不按任何列排序。
我想计算每个代码(按日期排序)的第一个差异(每日变化),并将它们放在我的数据框中的一个新列中。鉴于这种情况,我不能干脆做
df['diffs'] = df['value'].diff()
因为相邻的行不是来自同一个代码。排序如下:
df = df.sort(['ticker', 'date'])
df['diffs'] = df['value'].diff()
没有解决问题,因为会有“边界”。 IE。排序后,一个代码的最后一个值将高于下一个代码的第一个值。然后计算差异将在两个股票代码之间产生差异。我不想要这个。我希望每个代码的最早日期在其差异列中以NaN 结束。
这似乎是使用groupby 的明显时机,但无论出于何种原因,我似乎都无法让它正常工作。为了清楚起见,我想执行以下过程:
- 根据
ticker对行进行分组 - 在每个组中,按其
date对行进行排序 - 在每个排序组内,计算
value列的差异 - 将这些差异放入新的
diffs列中的原始数据框中(最好保留原始数据框的顺序。)
我不得不想象这是一个单线。但我错过了什么?
在 2013 年 12 月 17 日晚上 9:00 编辑
好的……有些进展。我可以执行以下操作来获取新的数据框:
result = df.set_index(['ticker', 'date'])\
.groupby(level='ticker')\
.transform(lambda x: x.sort_index().diff())\
.reset_index()
但如果我了解 groupby 的机制,我的行现在将首先按 ticker 排序,然后按 date 排序。那是对的吗?如果是这样,我是否需要进行合并以将差异列(当前位于 result['current'] 中)附加到原始数据框 df?
【问题讨论】: