我需要使用来自多行的输入对数据帧进行应用。举个简单的例子,如果所有输入来自一行,我可以执行以下操作:
df['c'] = df[['a','b']].apply(lambda x: awesome stuff, axis=1)
# or
df['d'] = df[['b','c']].shift(1).apply(...) # to get the values from the previous row
但是,如果我需要当前行中的'a'和前一行中的'b',是否有办法使用apply?我可以添加一个新的'bshift'列然后只使用df [['a','bshift']]但似乎必须有更直接的方式。
相关但分开,当访问df中的特定值时,有没有办法将标记索引与整数偏移相结合?例如。我知道当前行的标签但需要之前的行。像df.at['labelIknow'-1, 'a']
这样的东西(当然不起作用)。这是因为当我被迫迭代行时。提前谢谢。
编辑:有关我正在做什么的一些信息等。我有一个包含OHLC条形图的pandas商店(每个安全一个表)。在进行回测时,目前我将安全所需的完整日期范围拉到内存中,然后将其重新采样到对手头测试有意义的频率。然后我对交易输入信号等事情做了一些矢量化操作。最后,我从开始到结束循环数据进行实际的回测,例如检查交易进入退出,缩减等 - 这个循环部分是我试图加速的部分。
答案 0 :(得分:2)
这应该直接回答你的问题并允许你使用apply,虽然我不确定它最终会比双线解决方案更好。它确实至少避免创建额外的变量。
df['c'] = pd.concat([ df['a'], df['a'].shift() ], axis=1).apply(np.mean,axis=1)
例如,这会将当前行和前一行的'a'值的均值放入'c'。
这不是一般的,但对于更简单的情况,你可以做这样的事情(继续这个例子):
df['c'] = ( df['a'] + df['a'].shift() ) / 2
这比我的微小示例数据集上的concat()方法快了大约10倍。如果你能用这种风格编码,我想你的速度和它一样快。
您还可以考虑使用stack()和分层索引来重塑数据。这将是一种将所有变量放入同一行的方法,但我认为它可能比concat方法更复杂,或者只是通过shift()创建中间变量。
答案 1 :(得分:1)
对于第一部分,我不认为这样的事情是可能的。如果你更新你真正想要达到的目标,我可以更新这个答案。
另外,在第二部分中,您的数据结构似乎非常依赖行 order 。这通常不是您想要管理数据库的方式。同样,如果您告诉我们您的总体目标是什么,我们可能会暗示您寻求解决方案(并且可能是构建数据库的更好方法)。
无论如何,如果您知道给定的索引标签,之前获取该行的一种方法是:
df.ix[:'labelYouKnow'].iloc[-2]
请注意,这不是效率方面的最佳选择,因此您可能希望改进数据库结构,以防止执行此类操作。