首页 文章

大熊猫变量转换出错

提问于
浏览
2

在下面的示例中,第一个应用有效 . 第二个抛出“TypeError :(”无法根据规则'safe'“将数组数据从dtype('float64')转换为dtype('int64'),”u'occurred at index 0'“

df = pd.DataFrame({'lag':[ 3, 5, 3, 4, 2, 3, 2, 3, 4, 3, 2, 2, 2, 3],
                   'A':[10,20,30,40,20,30,40,10,20,30,15,60,20,15],
                   'B':[11,21,31,41,21,31,41,11,21,31,15,61,21,25]})
df['C'] = df.apply(lambda x: df['A'].shift(x['lag'])[x.name], axis=1)
print df
df['D'] = df.apply(lambda x: df['B'].shift(x['lag'])[x.name], axis=1)
print df

请告诉我为什么会发生这种情况以及如何解决它 . 谢谢,

(注意:我没有足够的"points"在Variable shift in Pandas发表评论)

1 回答

  • 2

    这实际上是一个棘手的事情 . 我会尽量简洁 .

    当您使用 applyaxis=1 时,您将逐行迭代 . 对于每一行,pandas将其处理为 pd.Series . 在初始赋值之后,将 NaN 值放在 df 中 . 当访问该行时,整行被解释为 float


    work around # 1
    确保滞后值为 int

    df['D'] = df.apply(lambda x: df['B'].shift(int(x['lag']))[x.name], axis=1)
    

    work around # 2
    同时做作业

    df = df.assign(
        C=df.apply(lambda x: df['A'].shift(x['lag'])[x.name], axis=1),
        D=df.apply(lambda x: df['B'].shift(int(x['lag']))[x.name], axis=1)
    )
    

    better solution
    但是,我会使用 numpy 来帮助解决这个问题

    那些滞后只是当前位置值减去滞后值

    l = (np.arange(len(df)) - df.lag.values)
    

    然后

    df['C'] = np.where(l >= 0, df.A.values[l], np.nan)
    df['D'] = np.where(l >= 0, df.B.values[l], np.nan)
    

相关问题