在下面的示例中,第一个应用有效。第二个引发“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
请告诉我为什么会发生这种情况以及如何解决这个问题。 谢谢,
(注意:我没有足够的“积分”在Variable shift in Pandas)
发表评论答案 0 :(得分:2)
这实际上是一件棘手的事情。我会尝试简洁。
当apply
与axis=1
一起使用时,您将逐行迭代。对于每一行,pandas将其处理为pd.Series
。在初始分配后,您将NaN
值放在df
中。当访问该行时,整行将被解释为float
解决#1
确保滞后值为int
df['D'] = df.apply(lambda x: df['B'].shift(int(x['lag']))[x.name], axis=1)
解决#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)
)
更好的解决方案
但是,我使用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)