Кластеризация похожих значений во фрейме данных на основе средних значений

#python #pandas #numpy

#python #pandas #numpy

Вопрос:

У меня есть фрейм данных, в котором есть записи для продаж по зонам, их необходимо кластеризовать на основе средних продаж

 Zone         Consumption
North          1
South          3
East           10
North          8
North2         0
South          5
  

Я использовал приведенный ниже код

 def Clustering(row):
    if row['Consumption']<.5*np.mean(['Consumption']):
        val='E'
    elif row['Consumption']<.75*np.mean(['Consumption']):
        val='D'
    elif row['Consumption']<1*np.mean(['Consumption']):
        val='C'
    elif row['Consumption']<1.5*np.mean(['Consumption']):
        val='B'
    elif row['Consumption']<2.5*np.mean(['Consumption']):
        val='A'
    else:
        val='Z'
    return val
  

Обратная трассировка

 <ipython-input-21-f08d8263edc0> in Clustering(row)
      1 def Clustering(row):
----> 2     if row['Consumption']<.5*np.mean(['Consumption']):
      3         val='E'
      4     elif row['Consumption']<.75*np.mean(['Consumption']):
      5         val='D'

<__array_function__ internals> in mean(*args, **kwargs)

~anaconda3libsite-packagesnumpycorefromnumeric.py in mean(a, axis, dtype, out, keepdims)
   3333 
   3334     return _methods._mean(a, axis=axis, dtype=dtype,
-> 3335                           out=out, **kwargs)
   3336 
   3337 

~anaconda3libsite-packagesnumpycore_methods.py in _mean(a, axis, dtype, out, keepdims)
    149             is_float16_result = True
    150 
--> 151     ret = umr_sum(arr, axis, dtype, out, keepdims)
    152     if isinstance(ret, mu.ndarray):
    153         ret = um.true_divide(

TypeError: cannot perform reduce with flexible type
  

Я предполагал, что ошибка вызвана тем, что, возможно, столбец Sales имеет некоторые значения str, но это не так, как я могу это исправить.

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

1. Ваш образец данных показывает, Sales но ваш код показывает Consumption . Каково фактическое имя столбца?

2. внесли коррективы

Ответ №1:

Вы пробовали pd.cut ? Предполагая df['Consumption'].mean() >= 0 :

 # Define the bins, which are double-ended by -INF and INF
bins = np.array([.5, .75, 1, 1.5, 2.5]) * df['Consumption'].mean()
bins = np.hstack((np.NINF, bins, np.inf))

df['Cluster'] = pd.cut(df['Consumption'], bins, labels=list('EDCBAZ')).astype('str')