Добавление новых столбцов в фрейм данных на основе значения из другого столбца - PullRequest
0 голосов
/ 17 января 2019

Я прочитал много вопросов по этому поводу, но я не мог понять, как применить эти решения к моей собственной проблеме. Я полагаю, что должен использовать 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

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Для нескольких условий вы можете использовать np.select. Вы можете начать с определения условий:

c1 = df.switchopen & ~df.switchclose
c2 = ~df.switchopen & df.switchclose
c3 = ~df.switchopen & ~df.switchclose

И в правильном выражении укажите choicelist, из которого взяты выходные элементы:

df['position'] = np.select([c1,c2, c3], ['open','closed', 'moving'])

     switchopen  switchclose position
0         True        False     open
1         True        False     open
2        False        False   moving
3        False        False   moving
4        False        False   moving
5        False         True   closed
6        False         True   closed
7        False         True   closed
8        False         True   closed
9        False         True   closed
10       False        False   moving
11       False        False   moving
12       False        False   moving
13        True        False     open
14        True        False     open
15       False        False   moving
16       False        False   moving
17        True        False     open
0 голосов
/ 17 января 2019

Мне нравится np.where.Вот решение с этим:

import numpy as np
df.loc[:,'position1'] = np.where((df['switchopen'] == True) & (df['switchclose'] == False), 'open',
                        np.where((df['switchopen'] == False) & (df['switchclose'] == True), 'closed',
                        np.where((df['switchopen'] == False) & (df['switchclose'] == False), 'moving',
                                np.nan)))

Как видите, вы можете установить NaN ни для одного из условий.

0 голосов
/ 17 января 2019

Учитывая ваши логические требования и ожидаемые результаты, это должно работать

df.loc[(df['switchopen'] == True) & (df['switchclose'] == False), 'Position'] = 'open'
df.loc[(df['switchopen'] == False) & (df['switchclose'] == True), 'Position'] = 'closed'
df.loc[(df['switchopen'] == False) & (df['switchclose'] == False), 'Position'] = 'moving'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...