Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫应用来自多行的输入_Python_Pandas - Fatal编程技术网

Python 熊猫应用来自多行的输入

Python 熊猫应用来自多行的输入,python,pandas,Python,Pandas,我需要使用来自多行的输入对数据帧进行应用。作为一个简单的示例,如果所有输入都来自一行,我可以执行以下操作: 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实

我需要使用来自多行的输入对数据帧进行应用。作为一个简单的示例,如果所有输入都来自一行,我可以执行以下操作:

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条的表格(每个安全一张表格)。在进行回溯测试时,目前我将安全性所需的完整日期范围拉入内存,然后将其重新采样为对当前测试有意义的频率。然后,我对交易进入信号等进行一些矢量化操作。最后,我从开始到结束进行实际回溯测试时循环数据,例如检查交易进入退出、提款等-这个循环部分是我试图加速的部分。

对于第一部分,我认为这样的事情不可能。如果你更新了你真正想要达到的目标,我可以更新这个答案

再看看第二部分,您的数据结构似乎非常依赖于行的顺序。这通常不是管理数据库的方式。同样,如果您告诉我们您的总体目标是什么,我们可能会提示您找到一种解决方案(以及一种更好的数据库结构方式)

无论如何,如果您知道给定的索引标签,那么获取之前的行的一种方法是:

df.ix[:'labelYouKnow'].iloc[-2]

请注意,这并不是效率方面的最佳选择,因此您可能希望改进您的db结构,以避免执行此类操作。

这应该直接回答您的问题,并让您使用apply,尽管我不确定它最终是否比双线解决方案更好。它至少避免了创建额外的变量

df['c']=pd.concat([df['a'],df['a'].shift(),axis=1)。应用(np.mean,axis=1)

例如,这将把当前行和上一行中“a”值的平均值放入“c”

这不是一般性的,但对于更简单的情况,您可以这样做(继续下面的示例):

df['c']=(df['a']+df['a'].shift())/2

这比我的小示例数据集上的concat()方法快10倍左右。我想这是你能做的最快的了,如果你能用那种风格编码的话


您还可以考虑使用stack()和层次索引来重塑数据。这是一种将所有变量放入同一行的方法,但我认为这可能比concat方法或通过shift()创建中间变量更复杂。

我认为这样的事情不可能发生。你到底想达到什么目的?从一开始,
apply()
可能是错误的方法。我目前迭代进行回测,并试图让代码运行得更快。每一行(时间点)取决于之前发生的事情,但也取决于当前发生的事情。在每次迭代中都会有很多东西(目前大约有50行代码)发生,但我想我应该尽可能多地将它们应用到applies中,看看是否有帮助。按行
Apply()
并不会神奇地让代码更快。如果有一个操作可用于按列预先计算某些值,则应在开始之前进行。(正如你们已经做过的,移动列是其中之一)。关于应用的要点并没有神奇地更快。仔细想想,我想多个应用程序最终可能会比单个大型for循环慢。第一个答案让我想试试。添加了一点背景。考虑到你关于应用和速度的观点,我想我要做的是尽可能多地进行矢量化,看看我还剩下什么,然后带着更多的问题回来。如果我试图发布我所有的代码,它只是超载。感谢您的建议。索引是一个经过排序和重采样(按规则间隔读取)的时间序列,因此以前的条始终是一个恒定的时间增量。对于第二部分,我目前正在添加一个数据移位的列(我也可以按偏移量计算索引,例如,
.ix[currenttime-DateOffset(seconds=1),'a']
,但这似乎效率很低),但我只是希望有一些我没有意识到的高效选择魔法。也许我是想:)谢谢。我为您的第一个方法计时,而不是添加一个移位列,然后在完成应用后删除它,有趣的是,对于我尝试的任何df大小,它们实际上是相同的(而且不是很快),所以我猜时间都花在了应用本身上。事实上,第二种方法(矢量化)要快得多,我会尽可能多地使用它,但不幸的是,我认为不可能将所有方法矢量化。@fantabolous这不仅仅是应用,连接/合并或创建新变量也有点贵。在我的示例数据中,大约一半的时间成本来自concat,一半来自apply。只需将apply(mean)替换为mean(),您将看到它仍然较慢。有趣的是,您应该将其提出来。。我用
.mean(axis=1)
试过,在我的10000x2 randn测向仪上,用
.apply(np.mean,axis=1)
大约需要2.5ms,而用
试过480ms。在这两种情况下,都包括添加新的“bshift”列,然后再次删除它。如果我使用你的.concat方法也是一样的:直接执行
.mean
要快得多。我不太理解熊猫的内部结构,但Jeff在