我有一个数据集,如下列带(c1)。将值与同一列中的上一个值和同一列中的下一个值进行比较。基于某些条件标签行。
C1
----
3
2
5
3
2
4
条件:
x是当前值
p是先前的值
n是下一个值
第一个和最后一个值默认为" 0"
如果x大于p,大于n,则标记为" 0:
"p<x>n = 0
p>x<n则x是" 1&quot"
p<x<n则x是" 2"
p>x>n则x是" 3&quot"
要存储的结果是单独的列C2
最终结果:
C1 | C2
-----+-----
3 | 0
2 | 2
5 | 0
3 | 3
2 | 1
4 | 0
我相信Shift是去这里的方式,
i从创建数据框和两个列开始,一个移动以显示下一个数字,另一个是在同一行上显示上一个数字。我还创建了一个空白列,我们将将您的目标输入(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
希望这会有所帮助!
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列表,而您给出的条件是不同的。
使用Shift在数据框架中创建一个新的滞后列。然后,您可以轻松地以矢量化的方式比较两个列的值(这很快),并将其存储在新列中。