熊猫.shift函数产生一个“'float'对象,没有属性'shift'','出现在索引0')

时间:2019-07-13 02:38:44

标签: python python-3.x pandas

我正在尝试使用非常复杂的if语句 (为了清楚起见,我对其进行了简化)在熊猫数据框中创建新列 。我不断收到错误消息:(““ float”对象没有属性“ shift””,“发生在索引0”)。 我到处查看了堆栈/互联网,却没有为我的解决方案找到一个很好的答案。一些答案涉及将.shift移出函数,但是,由于我正在编写的if语句的复杂性质,我需要将其移入函数。

我在下面附加了一张图片,详细说明了我最终希望该功能执行的操作。我相信它比用言语描述它更好地解释了它。 任何帮助或指导将不胜感激。

如果您有任何疑问或我可以澄清任何事情,请告诉我!

Ultimate end result desired

代码示例

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)

2 个答案:

答案 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