创建新列,比较 pandas 数据框中的行

create new column that compares across rows in pandas dataframe

我希望根据接下来两行中看到的值在数据框中创建一个新列。具体来说,如果接下来两行中的任何值都低于 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 行值作为输入传递。

我在这个网站上找到了很多关于跨列比较的帮助,但不知道如何像我描述的那样"look ahead"。

感谢您的帮助!

您可以将 new 值设置为 1,然后使用 locshiftlt(小于)一起将适当的值设置为零。

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