Сдвиг столбца в pandas на основе условного оператора - PullRequest
1 голос
/ 06 августа 2020

Я пытаюсь сместить столбец во фрейме данных, создав условный оператор, но не уверен, что делаю неправильно. В этом фрейме данных около 1000+ строк, но вот образец.

Исходный фрейм данных

Price Range    str_num     str_dir        str          str_sfx      city              zip
200 - 300k     123         Fake           St           Boulder      80304            None
300 - 400k     456         Main           St           Erie         80123            None
300 - 400k     789         E              Lolly        St           Boulder          80302
300 - 400k     999         N              Home         Ave          Lafayette        80027

Теперь я хочу сказать, если в столбце str_dir нет N , E, W, S, сдвиньте вправо, остальное заполните NaN. Вот мой код на данный момент.

mylist = ['N','E','W','S']
a=df[~df['str_dir'].isin(mylist)].shift(periods=-1, axis='columns', fill_value=np.NaN)
out_df=a.combine_first(df)

Однако, когда я запускаю этот код, я получаю этот фрейм данных.

Price Range    str_num     str_dir        str           city              zip
123            Fake        St             Boulder       80304            None
456            Main        St             Erie          80123            None
300 - 400k     789         E              Lolly         Boulder          80302
300 - 400k     999         N              Home          Lafayette        80027

Я ищу это

Price Range    str_num     str_dir        str           str_sfx              city              zip
200 - 300k     123         NaN            Fake          St                  Boulder          80304
300 - 400k     456         NaN            Main          St                  Erie             80123
300 - 400k     789         E              Lolly         St                  Boulder          80302
300 - 400k     999         N              Home          Ave                 Lafayette        80027

1 Ответ

1 голос
/ 06 августа 2020

Используйте Series.isin для создания логической маски m, затем используйте DataFrame.loc с маской m, чтобы выбрать строки и столбцы фрейма данных, которые должны быть сдвигается с использованием DataFrame.shift вдоль axis=1:

m = ~df['str_dir'].isin(mylist)
df.loc[m, 'str_dir':] = df.loc[m, 'str_dir':].shift(axis=1)

Результат:

  Price Range  str_num str_dir    str str_sfx       city    zip
0  200 - 300k      123     NaN   Fake      St    Boulder  80304
1  300 - 400k      456     NaN   Main      St       Erie  80123
2  300 - 400k      789       E  Lolly      St    Boulder  80302
3  300 - 400k      999       N   Home     Ave  Lafayette  80027
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...