Создание столбца для отслеживания пропущенных значений в другом столбце - PullRequest
2 голосов
/ 21 января 2020

Я добавляю фиктивный фрейм данных, чтобы проиллюстрировать мою проблему.

У меня большой фрейм данных, в котором в некоторых столбцах отсутствуют значения. Я хотел бы создать несколько дополнительных логических столбцов, в которых 1 соответствует отсутствующему значению в строке, а 0 соответствует отсутствующему значению.

names = ['Banana, Andrew Something (Maria Banana)', np.nan, 'Willis, Mr. Bruce (Demi Moore)', 'Crews, Master Terry', np.nan]

room = [100, 330, 212, 111, 222]

hotel_loon = {'Name' : pd.Series(names), 'Room' : pd.Series(room)}

hotel_loon_df = pd.DataFrame(hotel_loon)

В другом вопросе я обнаружил переполнение стека они были очень тщательны и ясны в том, что делать, чтобы отслеживать все столбцы, в которых отсутствуют значения, но не для определенных c. Я попробовал несколько вариантов этого кода (а именно с помощью где), но мне не удалось создать то, что я хотел, что-то вроде этого:

                                       Name Room Name_present Room_present
0   Banana, Andrew Something (Maria Banana) 100             1            1 
1                                      NaN  330             0            1
2          Willis, Mr. Bruce (Demi Moore)   212             1            1
3                    Crews, Master Terry    111             1            1
4                                    NaN    222             0            1

Спасибо за ваше время, я уверен, что в конец это будет тривиально, но по какой-то причине я застрял.

Ответы [ 4 ]

3 голосов
/ 21 января 2020

Чтобы сохранить набор текста, используйте DataFrame.notnull, добавьте несколько суффиксов и присоедините результат обратно.

pd.concat([df, df.notnull().astype(int).add_suffix('_present')], axis=1)

                                      Name  Room  Name_present  Room_present
0  Banana, Andrew Something (Maria Banana)   100             1             1
1                                      NaN   330             0             1
2           Willis, Mr. Bruce (Demi Moore)   212             1             1
3                      Crews, Master Terry   111             1             1
4                                      NaN   222             0             1
3 голосов
/ 21 января 2020

Вы можете использовать .isnull() для своего случая и изменить тип с bool на int:

hotel_loon_df['Name_present'] = (~hotel_loon_df['Name'].isnull()).astype(int)
hotel_loon_df['Room_present'] = (~hotel_loon_df['Room'].isnull()).astype(int)

Out[1]: 
                                      Name  Room  Name_present  Room_present
0  Banana, Andrew Something (Maria Banana)   100             1             1
1                                      NaN   330             0             1
2           Willis, Mr. Bruce (Demi Moore)   212             1             1
3                      Crews, Master Terry   111             1             1
4                                      NaN   222             0             1

~ означает противоположность или что-то, что не является.

0 голосов
/ 21 января 2020

Мы можем сделать это кратко, используя DataFrame.isnull:

hotel_loon_df[['Name_present', 'Room_present']] = (~hotel_loon_df.isnull()).astype(int)

                                      Name  Room  Name_present  Room_present
0  Banana, Andrew Something (Maria Banana)   100             1             1
1                                      NaN   330             0             1
2           Willis, Mr. Bruce (Demi Moore)   212             1             1
3                      Crews, Master Terry   111             1             1
4                                      NaN   222             0             1
0 голосов
/ 21 января 2020

Если вы отслеживаете только поля Nan, вы можете использовать функцию isnull ().

df['name_present'] =df['name'].isnull()
df['name_present'].replace(True,0, inplace=True) 
df['name_present'].replace(False,1, inplace=True) 
df['room_present'] =df['room'].isnull()
df['room_present'].replace(True,0, inplace=True)
df['room_present'].replace(False,1, inplace=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...