创建新列,比较 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,然后使用 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
我希望根据接下来两行中看到的值在数据框中创建一个新列。具体来说,如果接下来两行中的任何值都低于 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,然后使用 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