首页 > 解决方案 > Pandas .shift 函数产生一个“'float'对象没有属性'shift'”,'发生在索引0')

问题描述

我正在尝试使用非常复杂的 if 语句在 pandas 数据框中创建一个新列(为了清楚起见,我在下面对其进行了简化)。我不断收到错误消息:(“'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)

标签: pythonpython-3.xpandas

解决方案


如果需要,您可以传递其他参数apply。在这种情况下,您可以根据需要传递 maindf和您的ubk句柄/处理它。我不知道您的确切目的ubk,所以我只是修改ubk以完成您为 column 描述的内容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

推荐阅读