我在下面收到此错误
AttributeError:(“'float'对象没有属性'shift'”,'发生在索引718170')
运行下面的 pandas 脚本。
def volumediff(x):
if x['positive_mvt'] == True:
volume_d = x['volume'].shift(1)
else:
volume_d = ""
return volume_d
df['new_volume'] = df.apply(volumediff,axis=1)
因此,我相信基于 AttributeError: 'float' object has no attribute 'split' 处几乎类似的错误,我以为问题是 由空值引起,因为移位函数采用的值可能不在我的数据集中。但是,我成功地完成了以下操作,没有任何问题。
df['new_volume'] = df['volume'].shift(1)
不幸的是,它不适用于我需要的 apply 函数,因为我需要使用“if else”。
我尝试使用下面的脚本来解决问题 - 通过使用 try except 来跳过任何产生值问题的单元格。但我的列中的所有值都收到“NA”和“”,但事实不应该如此。
def volumediff(x):
if x['positive_mvt'] == True:
try:
volume_d = x['volume'].shift(1)
except:
volume_d = "NA"
else:
volume_d = ""
return volume_d
df['new_volume'] = df.apply(volumediff,axis=1)
原始样本 df:
x = [
[False, 240.20353],
[False, 621.28854],
[True, 64.85972],
[True, 151.86484],
[False, 190.91042],
[True, 128.78566],
[False, 415.53138],
[True, 43.14669],
[True, 512.03531],
[True, 502.41939],
]
df = pd.DataFrame(x, columns=['positive_mvt', 'volume'])
df
Out[1]:
positive_mvt volume
0 False 240.20353
1 False 621.28854
2 True 64.85972
3 True 151.86484
4 False 190.91042
5 True 128.78566
6 False 415.53138
7 True 43.14669
8 True 512.03531
9 True 502.41939
错误示例:
我检查了我的数据框,我怀疑这个问题可能是由我的 if 函数之间的冲突引起的,该函数只选择正确的行,但是 x[volume].shift( 需要一些错误的行1) 这是它上面的行。但事实并非如此,因为当我尝试下面的脚本时,它也不起作用并触发相同的属性错误。看起来使用 apply 函数不适用于 .shift。
def volumediff(x):
volume_d = x['volume'].shift(1)
return volume_d
df['new_volume'] = df.apply(volumediff,axis=1)
有人对如何解决这个问题有任何见解,而不需要做两个单独的列并依次分别处理 if else 和负移位公式吗?
最佳答案
当您运行apply
时,它将每个列/行(在您的案例行中)传递给您正在应用的函数。如果您对一个系列调用 .shift()
,这是有意义的 - 您正在移动该系列。正如您所做的那样,对系列中的单个值调用 shift 是没有意义的(您如何移位 12?这意味着什么?)。
您想要做的是:
df['new_volume'] = df['volume'].shift(1)
df.loc[df['positive_mvt'] == False, 'new_volume'] = ""
此外,我不知道您的数据类型是什么,您可能应该小心。
关于Python Pandas 数据帧移位在应用函数中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57207005/