Вам нужно извлечь действительное значение там, с помощью метода .quantile()
мы получаем объект серии, содержащий 1 значение, но pandas не понимает, что его единственное значение, по его мнению, мы сравниваем серию и, следовательно, ошибку, мыполучить номер внутри, используя .values[0]
import pandas as pd
import numpy as np
### making some sample data
df = pd.DataFrame({"area_tipe":np.random.choice(["m","n","o"],100)
, "price" : np.random.randint(1,10,100)
, "segment":np.random.choice(["p","q","r"],100)})
### keeping the function ot of the for loop
def classifierprice(x, a, b):
x = float(x)
if x <= a:
rep = 'low'
elif a < x < b:
rep = 'medium'
elif x >= b:
rep = 'high'
return rep
for i in list(df['segment'].unique()):
temp = df.query('segment== "%s"' %i)
for t in list(temp['area_tipe'].unique()):
temp2 = temp.query('area_tipe== "%s"' %t)
a = temp2.quantile(q=0.33).values[0]
b = temp2.quantile(q=0.66).values[0]
temp2['price_class'] = temp2['price'].apply(lambda x: classifierprice(x,a,b))
ВЫХОД:

Вы можете сделать этобез петель, вы получите все выходные df одновременно!- попробуйте это как стартер -
def grouped_classifierprice(df_filt):
a = df_filt.quantile(q=0.33).values[0]
b = df_filt.quantile(q=0.66).values[0]
return df_filt.price.apply(lambda x: classifierprice(x,a,b))
outdf = df.groupby(["area_tipe","segment"]).apply(grouped_classifierprice)