Распределение по признакам. Ошибка - ValueError: Grouper and axis must be same length

У меня есть три таблицы. Я их объединяю в одну после высчитываю перцентили и строю гистограмму распределения времени. После нужно сделать распределение по признакам, но выскакивает ошибка: ValueError: Grouper and axis must be same length.

all_table = pd.merge(regist.append(new_events), purch, on = ('user_id'), how = 'right')
all_table.head()

import numpy as np
import seaborn as sns 
import matplotlib.pyplot as plt

np.percentile(all_table['order_sum'], 100)
np.percentile(all_table['order_sum'], 95)
np.percentile(all_table['order_sum'], 85)

perc_85 = np.percentile(all_table['order_sum'], 85)

plt.figure(figsize=(10, 5)) # размерность

plt.hist(all_table['order_sum'], bins=50, color='r')
plt.vlines(perc_85, ymin = 0, ymax = 0.7, linestyles = 'dashed', label = f'85-ый перцентиль – {perc_85} дней')

plt.title('Распределение времени между первым заходом на сайт и покупкой') #Заголовок
plt.xlabel('Время') #Название оси X
plt.ylabel('Покупки') #Название оси Y 
plt.grid() # сетка
plt.axvline(perc_85, color='k', linestyle='--')

plt.legend()
plt.show()

def plot_segment_distribution(all_table, geo, device):
    for segment in geo:
        aggregated_geo = all_table.groupby(by = [device, geo])['user_id'].count().reset_index()
        sns.catplot(x = geo, 
                    y = 'user_id', 
                    hue = device, # сообщаем, что хотим, чтобы разные группы имели разный цвет
                    data = aggregated_geo, 
                    kind = "bar", 
                    height = 4, # задаем размер графика 
                    aspect = 1.5) # задаем ширину столбца\

plot_segment_distribution(all_table, #датафрейм
                           ["geo", "device"], #сегменты
                           "test_group") #тест-фактор

Объединение таблиц

Гистограмма распределения времени

Ошибка


Ответы (1 шт):

Автор решения: CrazyElf

Что-то тут не так:

    for segment in geo:
                   ^^^
        aggregated_geo = all_table.groupby(by = [device, geo])['user_id'].count().reset_index()
                                                         ^^^
        sns.catplot(x = geo,
                        ^^^ 
        ...

Вы вот эту переменную цикла segment нигде потом не используете, зато используете geo, по которой итерируетесь. Я подозреваю, что везде внутри цикла вместо geo должна быть переменная segment.

И вообще постарайтесь разобраться с именами переменных. Очень плохо, когда вы вызываете функцию с какими-то именами, а в параметрах самой функции есть те же имена переменных - но уже на других местах. Это очень запутывает. У вас при вызове функции получается фактически так:

geo = ["geo", "device"]
device = "test_group"

Вы сами не путаетесь с таким именованием переменных где у вас что?

→ Ссылка