Элементы карты из нескольких столбцов в Панд

#pandas #dataframe

Вопрос:

Я пытаюсь пометить некоторые значения в фрейме данных в Панд на основе самого значения на месте.

 df = pd.read_csv('data/extrusion.csv') # get list of columns that contain thickness columns = [c for c in data.columns if 'SDickeIst'.lower() in c.lower()]  # create a function that returns the class based on value def get_label(ser):  ser.map(lambda x : x if x == 0 else 1)  df[columns].apply(get_label)  

Я бы ожидал, что функция apply возьмет каждый столбец в отдельности и применит get_label к нему. В свою очередь, get_label получает ser аргумент в виде ряда и использует карту для сопоставления каждого элемента != 0 с 1.

Комментарии:

1. ваша функция не делает return ничего подобного

2. Может быть, это потому, что вы не возвращаете ser.map(...) строку из своей функции?

3. можете ли вы добавить некоторые данные, чтобы другие могли запускать / тестировать, пожалуйста

Ответ №1:

get_label ничего не возвращает.

Ты хочешь вернуться ser.map(lambda x : x if x == 0 else 1) .

 def get_label(ser):  return ser.map(lambda x : x if x == 0 else 1)  

Кроме того, apply он не действует на месте, он всегда возвращает новый объект. Поэтому вам нужно

 df[columns] = df[columns].apply(get_label)  

Но в этом простом случае использование DataFrame.where должно быть намного быстрее, если вы имеете дело с большими кадрами данных.

 df[columns] = df[columns].where(lambda x: x == 0, 1)  

Комментарии:

1. Это работает, хотя я получаю эту ошибку » SettingWithCopy Warning: значение пытается быть установлено для копии фрагмента из фрейма данных. Попробуйте вместо этого использовать .loc[row_indexer,col_indexer] = значение`

2. @AlexandruAntochi Это означает, что df на самом деле это фрагмент/ подмножество другого фрейма данных, верно? Это не ясно в описании.

3. Ошибка возникает при запуске df[столбцы] = df[столбцы].применить(get_label), но я думаю, что это может быть ложноположительное значение. Df-это не срез.