python比较上一行和下一行的值

时间:2019-02-21 15:44:58

标签: python pandas compare

我有一个数据集,如下所示带有(C1)列的示例。 将值与同一列中的上一个值和同一列中的下一个值进行比较。根据特定条件标记该行。

 C1
----
 3
 2
 5
 3
 2
 4

条件:

X是当前值
P是先前的值
N是下一个值
第一个和最后一个值默认为“ 0”

  1. 如果x大于P且大于N,则将其标记为“ 0”:

    P N = 0

  2. P> x

  3. P

  4. P> X> N则X为“ 3”

要存储的结果是单独的列C2

最终结果:

 C1  |  C2
-----+-----
 3   |  0
 2   |  2
 5   |  0
 3   |  3
 2   |  1
 4   |  0

3 个答案:

答案 0 :(得分:0)

c1 = [3,2,5,3,2,4]
c2 = [0]
for i in range(1,len(c1)-1):
    p = c1[i-1]
    x = c1[i]
    n = c1[i+1]
    if p < x and x > n:
        c2.append(0)
    elif p > x and x < n:
        c2.append(1)
    elif p < x and x < n:
        c2.append(2)
    elif p > x and x > n:
        c2.append(3)
c2.append(0)
print(c2)
>>> [0, 1, 0, 3, 1, 0]

我相信您在示例输出c2列表中弄错了,与您给输出的条件不同。

答案 1 :(得分:0)

使用shift在您的数据框中创建一个新的滞后列。然后,您可以轻松地以矢量化方式比较这两个列的值(这非常快),并将结果存储在新列中。

答案 2 :(得分:0)

我相信转变是前进的方向,

我首先创建数据框和两列,一列移动以显示下一个数字,另一列移动以在同一行上显示前一个数字。我还创建了一个空白列,将您的目标输入到(C2)

df = pd.DataFrame([3,2,5,3,2,4], columns=['C1'])

df['P'] = df.C1.shift(1).fillna(0)
df['N'] = df.C1.shift(-1).fillna(0)
df['C2'] = np.nan

给予我们

    C1  P   N   C2
0   3   0.0 2.0 NaN
1   2   3.0 5.0 NaN
2   5   2.0 3.0 NaN
3   3   5.0 2.0 NaN
4   2   3.0 4.0 NaN
5   4   2.0 0.0 NaN

然后我们进行比较,删除我们移出的两个移动的列,我们就完成了!

for index, row in df.iterrows():
    if (row.P < row.C1) and (row.C1 > row.N):
        df.at[index, 'C2'] = 0
    elif (row.P > row.C1) and (row.C1 < row.N):
        df.at[index, 'C2'] = 1
    elif (row.P < row.C1) and (row.C1 < row.N):
        df.at[index, 'C2'] = 2
    elif (row.P > row.C1) and (row.C1 > row.N):
        df.at[index, 'C2'] = 3

df.drop(['P', 'N'], 1, inplace=True)

这给我们留下了

    C1  C2
0   3   0.0
1   2   1.0
2   5   0.0
3   3   3.0
4   2   1.0
5   4   0.0

希望这会有所帮助!