我正在尝试使用非常复杂的if语句 (为了清楚起见,我对其进行了简化)在熊猫数据框中创建新列 。我不断收到错误消息:(““ float”对象没有属性“ shift””,“发生在索引0”)。 我到处查看了堆栈/互联网,却没有为我的解决方案找到一个很好的答案。一些答案涉及将.shift移出函数,但是,由于我正在编写的if语句的复杂性质,我需要将其移入函数。
我在下面附加了一张图片,详细说明了我最终希望该功能执行的操作。我相信它比用言语描述它更好地解释了它。 任何帮助或指导将不胜感激。
如果您有任何疑问或我可以澄清任何事情,请告诉我!
代码示例
df=pd.read_csv(file)
def ubk (df):
x = df['k_calc'].shift(1)
if x <90 :
return 1
elif x >90:
return 2
df['test'] = df.apply(ubk,axis = 1)
答案 0 :(得分:0)
您为什么不这样做:
df['test'] = 1+(df['k_calc'].shift(1)>=90).astype(int)
您收到的错误是因为您可能误解了apply的作用。
当您执行df.apply(ubk,axis = 1)
时,熊猫会将ubk应用于数据框中的每一行。结果,在函数调用中,df
不是原始数据帧,而是其行之一。因此,当您执行x = df['k_calc'].shift(1)
时,由于df['k_calc']
是单个条目(浮点数),因此熊猫会抱怨:他不知道任何shift()
的浮点方法。
答案 1 :(得分:0)
如果需要,可以将其他参数传递给apply
。在这种情况下,您可以传递主df
,而您的ubk
根据需要进行处理。我不知道您的ubk
的确切用途,因此我只修改ubk
以完成您对列test
的描述。看来您的逻辑效率不高,但是您可能有自己的理由使用它。因此,取决于您。
样本数据:
In [301]: df
Out[301]:
lowest_low k_calc d_cal
0 9.07 75.0000 NaN
1 9.07 79.7297 NaN
2 9.07 92.5675 NaN
3 9.07 66.2116 78.3772
函数并调用apply
来创建test
列,条件是:如果k_calc < 90
的前一个单元格返回1,> 90
则返回2,如下所示:
def ubk (s, m_df):
x = m_df['k_calc'].shift(1)[s.name]
if x <90 :
return 1
elif x >90:
return 2
df['test'] = df.apply(ubk, axis=1, args=(df,))
Out[304]:
lowest_low k_calc d_cal test
0 9.07 75.0000 NaN NaN
1 9.07 79.7297 NaN 1.0
2 9.07 92.5675 NaN 1.0
3 9.07 66.2116 78.3772 2.0