我希望根据接下来的两行中显示的值在数据框中创建一个新列。具体来说,如果接下来的两行中的任何值都低于4,那么我希望当前行中的新值为0(如果接下来的两行中的所有值都高于4,那么我想要当前行中的新值成为1)。
>>> df = pandas.DataFrame({"A": [5,6,7,3,2]})
>>> df
A
0 5
1 6
2 7
3 8
4 2
>>> desired_result = pandas.DataFrame({"A": [5,6,7,8,2], "new": [1,1,0,0,0]})
>>> desired_result
A new
0 5 1
1 6 1
2 7 0
3 8 0
4 2 0
你可以在" desired_result"第一个值是1,因为6和7都是> 4(并且相同的逻辑适用)直到在第三行中新值变为0,因为当我们向前看下两行(8,2)时,我们看到2是< 4因此值变为0.
我一直在尝试使用apply函数,但我无法弄清楚如何将接下来的2行值作为输入传递。
我在这个网站上找到了很多关于比较各列的帮助,但是无法弄清楚如何"展望未来"就像我描述的那样。
感谢您的帮助!
答案 0 :(得分:2)
您可以将new
值设置为1,然后将loc
与shift
和lt
(小于)一起使用,将适当的值设置为零。
df = pd.DataFrame({"A": [5, 6, 7, 8, 2]})
df['new'] = 1
df.loc[(df.A.shift(-1).lt(4)) | (df.A.shift(-2).lt(4)), 'new'] = 0
# The last value does not have any future observations and should be set to zero.
df.new.iat[-1] = 0
>>> df
A new
0 5 1
1 6 1
2 7 0
3 8 0
4 2 0
要扩展到接下来的8行而不是2:
nrows = 8
df.loc[eval(" | ".join("df.A.shift(-{0}).lt(4)".format(n)
for n in range(1, nrows + 1))), 'new'] = 0