AttributeError:' NoneType'对象没有属性' shift'

时间:2017-12-01 20:10:21

标签: pandas numpy vectorization

我正在寻找同样的问题,我想我知道为什么会这样,但不知道如何解决它。

我有一个带x值的数据帧(df)。我在构建一个更复杂的逻辑上尝试使用np.vectorize但是现在我在下面测试这个代码并且它最有可能发生错误,因为条件是在寻找x的先前值shift()如果你从第一行开始就不会是一个。所以我在线上得到了Nonetype错误

 def cond(x):
        if x.shift(1)==1:
           return 'a'
        else:
          return 'b'

func = np.vectorize(cond)

foo = func(df["xValue"])

df["xValue"] = foo

1 个答案:

答案 0 :(得分:0)

In [272]: df = pd.DataFrame(np.random.randint(0,100,size=(5, 3)), columns=list('ABC'))
In [273]: df
Out[273]: 
    A   B   C
0  13   5  45
1  28  41  89
2  63  87  46
3  53  81  54
4  26  82  46
In [274]: df['A']=df['A'].shift(1)
In [275]: df
Out[275]: 
      A   B   C
0   NaN   5  45
1  13.0  41  89
2  28.0  87  46
3  63.0  81  54
4  53.0  82  46

这里我将'A'向下移1,并用nan填充顶洞 - 这会将列的dtype更改为float。

听起来您想要在班次后将cond函数应用于元素。也就是说,进行列移位,然后将它们传递给cond

In [277]: df = pd.DataFrame(np.random.randint(0,100,size=(5, 3)), columns=list('ABC'))
In [278]: df
Out[278]: 
    A   B   C
0  18  59  16
1  69  85  41
2  53  91  37
3   8  22  17
4  10  90  26
In [279]: def cond(x):
     ...:     if x<50: return 'a'
     ...:     return 'b'

In [280]: func = np.vectorize(cond)
In [281]: func(df['A'])    # cond applied to column A
Out[281]: 
array(['a', 'b', 'b', 'a', 'a'],
      dtype='<U1')
In [282]: func(df['A'].shift(1))   # applied to column A after shift
Out[282]: 
array(['b', 'a', 'b', 'b', 'a'],
      dtype='<U1')
In [283]: df['A']=_     # now assign those values back to A
In [284]: df
Out[284]: 
   A   B   C
0  b  59  16
1  a  85  41
2  b  91  37
3  b  22  17
4  a  90  26

我认为pandas.apply也有效,但我知道numpy更好。