我想知道有没有什么更快的方法来完成下面的循环?可以使用apply或rolling apply函数来实现 基本上,我需要访问前一行的值来确定当前单元格的值。
df.ix[0] = (np.abs(df.ix[0]) >= So) * np.sign(df.ix[0])
for i in range(1, len(df)):
for col in list(df.columns.values):
if ((df[col].ix[i] > 1.25) & (df[col].ix[i-1] == 0)) | :
df[col].ix[i] = 1
elif ((df[col].ix[i] < -1.25) & (df[col].ix[i-1] == 0)):
df[col].ix[i] = -1
elif ((df[col].ix[i] <= -0.75) & (df[col].ix[i-1] < 0)) | ((df[col].ix[i] >= 0.5) & (df[col].ix[i-1] > 0)):
df[col].ix[i] = df[col].ix[i-1]
else:
df[col].ix[i] = 0
如您所见,在函数中,我正在更新数据帧,我需要访问最新的前一行,因此使用shift将不起作用。
例如: 输入:
A B C
1.3 -1.5 0.7
1.1 -1.4 0.6
1.0 -1.3 0.5
0.4 1.4 0.4
输出:
A B C
1 -1 0
1 -1 0
1 -1 0
0 1 0
我很惊讶没有一个本土的熊猫解决方案,因为转移和滚动没有完成。我已经设计了一种使用标准pandas语法的方法,但是我不确定它是否比您的循环执行得更好。。。我的目的只是为了一致性(而不是速度)。
免责声明:我使用了pandas 0.16,但只做了一点点修改,这也适用于最新版本。
其他人也有类似的问题,我也在这些问题上发布了这个解决方案:
可以使用.shift()函数访问上一个或下一个值:
col
列的上一个值:col
列的下一个值:示例:
@maxU有shift的权利,我想你甚至可以直接比较数据帧,如下所示:
语法可能是关闭的,但如果您提供一些测试数据,我认为这可以工作。
省得你必须循环。
编辑-根据下面的注释更新
我会尽我最大的努力不通过DF本身。最好是一列一列地进行,发送到一个列表并进行更新,然后再重新导入。像这样的:
相关问题 更多 >
编程相关推荐