Я прочитал много вопросов по этому поводу, но я не мог понять, как применить эти решения к моей собственной проблеме. Я полагаю, что должен использовать df.apply
или df.assign
, но я не понимаю, как даже после прочтения документации
Это мои данные:
d = {'switchopen': [True, True, False, False, False, False, False, False, False, False, False, False, False, True, True, False, False, True ],
'switchclose': [ False, False, False, False, False, True, True, True, True, True, False, False, False, False, False, False, False, False]}
df = pd.DataFrame(data=d)
Открыто, когда switchopen == True & switchclose == False
Закрыто, когда switchopen == False & switchclose == True
он движется, когда switchopen == False & switchclose == False
Мое текущее решение таково:
dfopen = df[(df.switchclose == False) & (df.switchopen == True)]
dfopen['Open'] = 'open'
dfclose = df[(df.switchclose == True) & (df.switchopen == False)]
dfclose['Moving'] = 'close'
dfmoving = df[(df.switchclose == False) & (df.switchopen == False)]
dfmoving['Close'] = 'moving'
dfs = [dfopen, dfclose, dfmoving]
dfz = pd.concat(dfs, sort= False)
dfz = dfz.sort_index(ascending=True)
dfz['Position'] = dfz['Position'].fillna(dfz['Open'])
dfz['Position'] = dfz['Position'].fillna(dfz['Close'])
print(dfz['Position'])
Что дает мне то, что я хочу, но я ищу лучшее решение, например:
df['Close'] = (df.switchclose == True & df.switchopen == False)
df['Open'] = (df.switchclose == False & df.switchopen == False)
df['Moving'] = (df.switchclose == False & df.switchopen == False)
А затем используйте .fillna
.
было бы лучше, если бы существовало решение, при котором этот шаг даже не был бы необходим
Ожидаемый результат такой:
Position
0 open
1 open
2 moving
3 moving
4 moving
5 close
6 close
7 close
8 close
9 close
10 moving
11 moving
12 moving
13 open
14 open
15 moving
16 moving
17 open