我正在寻找同样的问题,我想我知道为什么会这样,但不知道如何解决它。
我有一个带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
答案 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更好。