Python交叉或切换公式

Python交叉或切换公式,python,switch-statement,Python,Switch Statement,我想要一个公式或任何类似“开关”的东西。如果列“位置”变为3或以上,则开关接通(=1)。如果“位置”超过5,则开关关闭(=0)。如果位置低于3,开关也将关闭(=0)。我已经包括了“所需”专栏,以显示我希望这个新专栏能够自动完成的内容 df = pd.DataFrame() df['position'] = [1,2,3,4,5,6,7,8,7,6,5,4,3,2,1,2,3,4,5,4,3,2,1] df['desired'] = [0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,

我想要一个公式或任何类似“开关”的东西。如果列“位置”变为3或以上,则开关接通(=1)。如果“位置”超过5,则开关关闭(=0)。如果位置低于3,开关也将关闭(=0)。我已经包括了“所需”专栏,以显示我希望这个新专栏能够自动完成的内容

df = pd.DataFrame()
df['position'] = [1,2,3,4,5,6,7,8,7,6,5,4,3,2,1,2,3,4,5,4,3,2,1]
df['desired'] =  [0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0]
我将使用
.shift()
创建带有移位
位置的行,以便在一行中具有当前值和提供值。然后我可以检查它是否高于3、5或低于3,并更改将在列
“所需的”
中指定的值

创建列“所需”后,我必须删除移位的数据

import pandas as pd

df = pd.DataFrame()
df['position'] = [1,2,3,4,5,6,7,8,7,6,5,4,3,2,1,2,3,4,5,4,3,2,1]
#df['desired'] = [0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0]

df['previous'] = df['position'].shift()

# ---    

value = 0

def change(row):
    global value

    #print(row)
    if (row['previous'] < 3) and (row['position'] >= 3):
        value = 1
    if (row['previous'] >= 3) and (row['position'] < 3):
        value = 0
    if (row['previous'] <= 5) and (row['position'] > 5):
        value = 0

    return value

# ---

#for ind, row in df.iterrows():
#    print(int(row['position']), change(row))

df['desired'] = df.apply(change, axis=1)

df.drop('previous', axis=1)

print(df)

df['position'].map(lambda x:3在
6,5,4,3,2
5,4,3
的情况下-不应该是
1
?您有
0
@furas,似乎开关的状态仅在所述触发点发生变化。您描述这一点时,似乎希望它涉及到之前的计算结果,但它似乎并不是真的-y你不关心位置值“将”到某个范围,而只关心当前值是否在该范围内。是吗?@jornsharpe我认为你应该写下来作为答案;我不明白为什么解决方案需要比这更复杂。
    position  desired
0          1        0
1          2        0
2          3        1
3          4        1
4          5        1
5          6        0
6          7        0
7          8        0
8          7        0
9          6        0
10         5        0
11         4        0
12         3        0
13         2        0
14         1        0
15         2        0
16         3        1
17         4        1
18         5        1
19         4        1
20         3        1
21         2        0
22         1        0