条件迭代仅处理无结果/无错误

时间:2019-06-05 18:11:05

标签: python-3.x pandas

我正在尝试“循环”此数据框并根据其他列的条件添加一列。我想我用这种逻辑实现了我的结果,但似乎找不到正确的迭代器或其他方法来创建新列。在此示例中,我使用的是 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

enter image description here

1 个答案:

答案 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倍以上 方法。