Условное управление кадром данных - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть следующие данные. Я пытаюсь сделать следующее:

  1. Если элементы в tag_3 и tag_4 имеют значение «NaN», возвращают промежуточный df со следующими столбцами: tag_0, tag_1 & tag_2.
  2. Если элементы в tag_4 только 'NaN', тогда возвращают еще один промежуточный df со следующими столбцами: tag_0, tag_2, tag_3.
  3. Наконец, если ВСЕ столбцы имеют значения, отличные от NaN, вернуть промежуточный df со следующими столбцами: tag_0, tag_3, tag_4.

DATA:

data = {'tag_0': ['1', '2', '3'],
        'tag_1': ['4', '5', '6'],
        'tag_2': ['7', '8', '9'],
        'tag_3': ['NaN', '10', '11'],
        'tag_4': ['NaN', 'NaN', '12']}

df_1 = pd.DataFrame(data, columns = ['tag_0', 'tag_1', 'tag_2', 'tag_3', 'tag_4'])

фиктивные данные

1 Ответ

0 голосов
/ 13 сентября 2018

Мне нравится использовать маски bool для такого рода задач в пандах, потому что я думаю, что их легко читать, но есть и другие способы сделать это.

Что такое маска bool?

Маска bool - это, по сути, Series значений True / False, применяемых к DataFrame для ее фильтрации.


Шаг 1: создайте Series значений True / False.

tag_3_is_nan = df['tag3'].isna()
tag_4_is_nan = df['tag4'].isna()

Шаг 2: примените их к DataFrame

df[bool_mask]

В вашем случае это будет применяться с использованием следующей логики.

Случай 1: Если элементы в tag_3 и tag_4 имеют значение «NaN», то возвращают промежуточный df со следующими столбцами: tag_0, tag_1 & tag_2.

df[tag_3_is_nan & tag_4_is_nan][['tag_0', 'tag_1', 'tag_2']]

Случай 2: Если элементы в tag_4 только 'NaN', тогда возвращают еще один промежуточный df со следующими столбцами: tag_0, tag_2, tag_3.

df[tag_4_is_nan & ~tag_3_is_nan][['tag_0', 'tag_2', 'tag_3']]

~ равно not - поэтому ~tag_3_is_nan означает, что tag_3 - это не nan.

Случай 3: Наконец, если ВСЕ столбцы имеют значения, отличные от NaN, вернуть промежуточный df со следующими столбцами: tag_0, tag_3, tag_4.

Удалять все строки, которые содержат хотя бы одно значение NaN, в пандах просто - просто используйте метод dropna()

df.dropna()[['tag_0', 'tag_3', 'tag_4']]
  • Чтобы избежать settingWithCopyWarning вниз по строке, вы должны скопировать отфильтрованный df.

Выше используется None, но ваш пример использует 'NaN' в качестве string. Вы можете использовать тот же метод, если ваши данные содержат строки 'NaN', а не фактические None.

tag_3_is_nan_string = df['tag3'] == 'NaN'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...