我有一个如下所示的数据框
>>> df
t c f e
0 1 100 2 1
1 1 200 1 1
2 1 300 4 0
3 1 400 2 0
4 2 100 3 1
5 2 200 3 1
6 2 300 4 1
7 2 400 1 0
8 3 100 4 0
9 3 200 3 0
10 3 300 1 1
11 3 400 4 1
12 4 100 1 1
13 4 200 4 1
14 4 300 4 1
15 4 400 2 1
我想使用行的成对信息来添加新列。在上述情况下,如果第i行和第(i + 4)行的列'e'具有相同的值,我想添加值为1的新列“ rr”(如果i + 4索引确实为0,不存在),类似地,我还想添加另一列'rr2'是第i行,第(I + 1)行的列'e'具有相同的值。
>>> df
t c f e rr rr2
0 1 100 2 1 1 1
1 1 200 1 1 0 1
2 1 300 4 0 1 0
3 1 400 2 0 0 1
4 2 100 3 1 1 0
5 2 200 3 1 1 0
6 2 300 4 1 0 1
7 2 400 1 0 1 0
8 3 100 4 0 1 0
9 3 200 3 0 0 1
10 3 300 1 1 1 1
11 3 400 4 1 1 1
12 4 100 1 1 1 0
13 4 200 4 1 1 0
14 4 300 4 1 1 0
15 4 400 2 1 1 0
我的想法是使用apply方法
X['rr'] = X.apply(lambda x: func1(x),axis=1 )
X['rr2'] = X.apply(lambda x: func2(x),axis=1 )
但是在那种情况下,我将无法访问原始数据帧的i + 1或i + 4索引。 有没有一种方法可以有效地做到这一点,而不是一个接一个地遍历每一行。
答案 0 :(得分:1)
df['rr'] = df['e'].eq(df['e'].shift(-4)).astype(int)
df['rr2'] = df['e'].eq(df['e'].shift(-1)).astype(int)
print(df)
t c f e rr rr2
0 1 100 2 1 1 1
1 1 200 1 1 1 0
2 1 300 4 0 0 1
3 1 400 2 0 1 0
4 2 100 3 1 0 1
5 2 200 3 1 0 1
6 2 300 4 1 1 0
7 2 400 1 0 0 1
8 3 100 4 0 0 1
9 3 200 3 0 0 0
10 3 300 1 1 1 1
11 3 400 4 1 1 1
12 4 100 1 1 0 1
13 4 200 4 1 0 1
14 4 300 4 1 0 1
15 4 400 2 1 0 0
注意:
比较NaN时,结果始终返回False