无法在pandas中删除动态生成的列(作为变量)

时间:2017-10-22 09:36:38

标签: python pandas dictionary

无法删除动态生成的列。我是pandas(和python)的新手,并且修改了现有的pandas库,所以如果代码看起来有一半的能力,那就是为什么会有一半疯狂。

def _get_macd_c(df, f, s, g):
    fast = df['close_'+str(f)+'_ema']
    slow = df['close_'+str(s)+'_ema']
    df['macd'] = fast - slow
    df['macds'] = df['macd_'+str(g)+'_ema']
    df['macdh'] = (df['macd'] - df['macds'])
    del df['macd_'+str(g)+'_ema']
    del fast
    del slow

由变量**' fast'表示的列*并且“慢”'坚持df obj。为什么?

如果字符串不是动态df['close_10_ema'](原来的话),那么它就不是问题。我不清楚为什么这个改变使代表该列的变量不可删除。

2 个答案:

答案 0 :(得分:0)

如果使用del fastdel slow,则删除Series而不是列。

因此,要删除列名为fast的列,slowmacd_'+str(g)+'_ema需要:

del df['fast']
del df['slow']
del df['macd_'+str(g)+'_ema']

但是,对于删除多列,最好使用drop

df = df.drop(['fast','slow','macd_'+str(g)+'_ema'], axis=1)

在你的函数中,最好不要创建新列然后删除它们:

def _get_macd_c(df, f, s, g):

    #subtract 2 columns to Series macd
    macd = df['close_'+str(f)+'_ema'] - df['close_'+str(s)+'_ema']
    df['macdh'] = macd - df['macd_'+str(g)+'_ema']
    #if need remove column
    df = df.drop('macd_'+str(g)+'_ema', axis=1) 
    return df

我尝试重写你的功能:

def _get_macd_c(df, f, s, g):
    colf = 'close_'+str(f)+'_ema'
    cols = 'close_'+str(s)+'_ema'
    colg = 'macd_'+str(g)+'_ema'

    df['macd'] = df[colf] - df[cols]
    df['macds'] = df[colg]
    df['macdh'] = (df['macd'] - df['macds'])
    df = df.drop([colf, cols, colg], axis=1)
    return df

答案 1 :(得分:0)

似乎最好的解决方法是不按引用/变量删除列,而是按名称删除。我还不清楚为什么会这样。很高兴将此解释为正确答案,我的解决方案感觉有点黑客。

def _get_macd_c(df, f, s, g):
    fast = df['close_'+str(f)+'_ema']
    slow = df['close_'+str(s)+'_ema']
    df['macd'] = fast - slow
    df['macds'] = df['macd_'+str(g)+'_ema']
    df['macdh'] = (df['macd'] - df['macds'])
    del df['macd_'+str(g)+'_ema']
    del df['close_'+str(f)+'_ema']
    del df['close_'+str(s)+'_ema']