创建新列,用于比较pandas数据帧中的各行

时间:2016-02-12 01:20:40

标签: python pandas apply

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

我在这个网站上找到了很多关于比较各列的帮助,但是无法弄清楚如何"展望未来"就像我描述的那样。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您可以将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