我正在尝试“循环”此数据框并根据其他列的条件添加一列。我想我用这种逻辑实现了我的结果,但似乎找不到正确的迭代器或其他方法来创建新列。在此示例中,我使用的是 items ,但是此代码仅旋转了几分钟,并且没有给出任何结果,我手动取消了该代码。我的数据框有40万列。包括df的屏幕截图。
目标是填充['close'] == ['prev']的实例,并将0值替换为最新的交易信号(+或-)。
for index, col in df.T.iteritems():
if col['Close'] > col['prev']:
col['trade2'] = '+'
x = '+'
continue
elif col['Close'] < col['prev']:
col['trade2'] = '-'
x = '-'
continue
elif col['Close'] == col['prev']:
col['trade2'] = x
答案 0 :(得分:0)
我按如下方式创建了测试数据框:
df = pd.DataFrame(data=[
[ 36.50, 36.53, '-' ],
[ 36.53, 36.50, '+' ],
[ 36.53, 36.53, '0' ],
[ 36.53, 36.53, '0' ],
[ 36.53, 36.53, '0' ],
[ 36.51, 36.53, '-' ],
[ 36.51, 36.51, '0' ],
[ 36.53, 36.51, '+' ],
[ 36.53, 36.53, '0' ],
[ 36.53, 36.53, '0' ],
[ 36.53, 36.53, '0' ]],
columns=['Close', 'prev', 'trade'],
index=range(5,16))
要计算当前行的 trade2 值,我们有 定义以下功能:
def cmp(row):
global lastResult
if row.Close > row.prev:
lastResult = '+'
elif row.Close < row.prev:
lastResult = '-'
return lastResult
它使用全局变量 lastResult ,该变量将首先进行设置 到'0'。
除了使用 items 循环外,您应该应用 对每一行进行函数运算,并将结果替换为新列, 从 lastResult 的初始设置开始(如上所述):
lastResult = '0'
df['trade2'] = df.apply(cmp, axis=1)
这就是应该执行此类操作的方式。
关于您的代码的一句话。 如果您使用项目,则:
如果您已经有 trade 列,则可以执行:
df['trade2'] = df.trade.replace(to_replace='0')
此方法依赖于 trade 列始终为 string 的事实 (减号,加号或“ 0”),因此 to_replace 参数将匹配(字符串)零个大小写。
下一个参数- value -未给出,因此默认为 无。
在这种情况下,将采用 pad 替换方法,这意味着 向前填充值。
通过这种方式,“ +”或“-”在列下方被“复制”,仅给出 结果相同。
对于具有1100行的源DataFrame(您的DataFrame已复制100次) 我的执行时间比第一个要短100倍以上 方法。