我有一个数据集,如下所示带有(C1)列的示例。 将值与同一列中的上一个值和同一列中的下一个值进行比较。根据特定条件标记该行。
C1
----
3
2
5
3
2
4
条件:
X是当前值
P是先前的值
N是下一个值
第一个和最后一个值默认为“ 0”
如果x大于P且大于N,则将其标记为“ 0”:
P
P> x
P
P> X> N则X为“ 3”
要存储的结果是单独的列C2
最终结果:
C1 | C2
-----+-----
3 | 0
2 | 2
5 | 0
3 | 3
2 | 1
4 | 0
答案 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
希望这会有所帮助!