Что значит не обрабатываешь, вот
print(df.replace('?',np.nan).astype(float)
Здесь во все фрейме делаешь замену а потом весь фрейм пытаешься привести к типу данных float.
Работай с "числовым подсетом датафрейма".
или заведи отдельную переменную приведи подсет к флоатам и потом группируй. Типа такого
df_ = df.loc[:,[nuimeric_column1,numrec_column2]] = df.loc[:,[nuimeric_column1,numrec_column2]].replace('?',np.NaN).astype(float)
и затем группируй и т.д.
Или хочешь чейнить, используй assign рассматривай все колонки по отдельности, при сложныех манипуляциях, которые требуют индивидулаьного подхода, к каждой колонке по отдельности так делают.
(
df.assign(
numeric1=lambda x: x['numeric1'].replace('?',np.NaN).astype(float),
numeric2=lambda x: x['numeric2'].replace('?',np.NaN).astype(float)
)
.groupby('Category')
.agg(['mean','median'])
)