我需要使用来自多个行的输入对dataframe进行应用。作为一个简单的例子,如果所有输入都来自一个行,我可以执行以下操作:
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’,有什么方法可以通过应用来完成吗?我可以添加一个新的'bshift‘列,然后只使用df['a','bshift'],但它似乎有一个更直接的方式。
当访问df中的特定值时,是否有一种方法将标有标记的索引与整数偏移量相结合?我知道当前行的标签,但之前需要行。类似于df.at['labelIknow'-1, 'a'] (当然不起作用)。这是当我被迫遍历行时使用的。提前谢谢。
编辑:我有一些关于我正在做的事情的信息,等等。我有一个熊猫商店,里面有OHLC栏表(每个保安一张表)。在进行回溯测试时,目前我将安全所需的完整日期范围提取到内存中,然后将其重采样到对手头的测试有意义的频率中。然后,我对交易进入信号等做了一些矢量化操作。最后,我从开始到结束循环数据,做实际的回溯测试,例如检查交易进入出口,缩编等等--这个循环部分是我试图加快的部分。
发布于 2014-08-16 23:08:51
这应该直接回答您的问题,并让您使用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倍左右。我想,如果你能用这种方式对它进行编码,那将是你所能做到的最快的。
您还可以使用堆栈()和分层索引来重新定义数据。这将是将所有变量都放在同一行中的一种方法,但我认为它可能比concat方法更复杂,或者仅仅通过shift()创建中间变量。
发布于 2014-08-16 14:03:30
对于第一部分,我认为这样的事情是不可能的。如果你更新了你真正想要达到的目标,我可以更新这个答案。
在第二部分中,您的数据结构似乎依赖于行的顺序。这通常不是您想要管理数据库的方式。同样,如果您告诉我们您的总体目标是什么,我们可能会提示您解决方案(并且可能是构建数据库的更好方法)。
无论如何,如果您知道一个给定的索引标签,那么在此之前获取行的一种方法是:
df.ix[:'labelYouKnow'].iloc[-2]请注意,从效率的角度来看,这并不是最理想的做法,因此您可能希望改进您的db结构,以避免需要这样做。
https://stackoverflow.com/questions/25340726
复制相似问题