#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-это не срез.