在pandas/numpy python中使用同一列的2个数组进行向量化计算

bkhjykvo  于 12个月前  发布在  Python
关注(0)|答案(1)|浏览(90)

我有一个向量计算,它从数组中获取一个值,以及该数组下面的值。它检查上面的值是否为1,下面的值是否为0。如果是这种情况,使用np.,其中我将为true分配1,为false分配0。我似乎得到的错误是:“无法将输入数组从形状(6,)广播到形状(5,)”。

import pandas as pd
import numpy as np
data = {
    'A': [0, 0, 1, 0, 0, 0],
    'B': [0,0,0,0,0,0]
}
df = pd.DataFrame(data)
x=1
df.iloc[0:5,1]=np.where((df.iloc[0:5,0]==1) & (df.iloc[1:6,0]==0),x,0)

每个df.iloc的大小相同,最后一行只是一个虚拟行,以允许df.iloc[1:6,0]工作。
同样,当运行布尔值时,我得到:

(df.iloc[0:5,0]==1) & (df.iloc[1:6,0]==0)
Out[43]: 
0    False
1    False
2    False
3    False
4    False
5    False

但值2应该为真。我也试过让x成为一个数组,但似乎不起作用,任何帮助都将不胜感激!

sg24os4d

sg24os4d1#

具体的逻辑还不清楚,但你需要使用shift

# the current value is 1 and the below value is 0
m = df['A'].eq(1) & df['A'].shift(-1).eq(0)
df['out'] = np.where(m, 1, 0)

# the above value is 1 and the below value is 0
m2 = df['A'].shift().eq(1) & df['A'].shift(-1).eq(0)
df['out2'] = np.where(m2, 1, 0)

如果你想将TrueMap到1,并将FalseMap到0,不需要np.where,只需使用m.astype(int)
输出量:

A  B  out  out2
0  0  0    0     0
1  0  0    0     0
2  1  0    1     0
3  0  0    0     1
4  0  0    0     0
5  0  0    0     0

相关问题