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

#python #dataframe #dictionary #multi-index

#python #фрейм данных #словарь #многоиндексный

Вопрос:

У меня есть фрейм данных, который выглядит следующим образом:

                      brand  price
event_time      
2019-10-01 00:02:14 samsung 130.76
2019-10-01 00:04:37 apple   642.69
2019-10-01 00:06:02 xiaomi  29.51
2019-10-01 00:07:07 santeri 54.42
2019-10-01 00:09:26 apple   189.91
... ... ...
2019-11-30 23:58:14 samsung 346.70
2019-11-30 23:58:22 apple   1437.02
2019-11-30 23:58:57 samsung 235.60
2019-11-30 23:59:15 polaris 89.32

  

И мне нужно рассчитать среднюю цену для каждого бренда и для каждого месяца, поэтому я сделал это:

 sub_df = sub_df.groupby([pd.Grouper(freq='M'), 'brand'])['price'].mean()
  

Который выводит это:

 event_time  brand          price
2019-10-31  a-case       4.745862
            a-derma     12.360000
            a-mega     114.607778
            abk         11.560000
            abtoys      46.310000
                          ...    
2019-11-30  zotac      272.305714
            zte         79.501161
            zubr        89.318436
            zuru        12.840000
            zvezda      11.970000
  

И чтобы упростить изучение данных, я хотел преобразовать все это в словарь. Проблема в том, что словарь будет иметь двойной ключ вместо того, чтобы иметь несколько уровней! Что я сделал, так это написал это:

 dic_returns = sub_df.groupby(level='event_time').apply(lambda sub_df: 
                                         sub_df.xs(sub_df.name).to_dict()).to_dict()
  

и когда я вызываю словарь, он выдает:

 {(Timestamp('2019-10-31 00:00:00'), 'a-case'): 4.745862068965517,
 (Timestamp('2019-10-31 00:00:00'), 'a-derma'): 12.36,
 (Timestamp('2019-10-31 00:00:00'), 'a-mega'): 114.60777777777781,
 (Timestamp('2019-10-31 00:00:00'), 'abk'): 11.56,
 (Timestamp('2019-10-31 00:00:00'), 'abtoys'): 46.31,
 (Timestamp('2019-10-31 00:00:00'), 'acer'): 519.720941586739,
 (Timestamp('2019-10-31 00:00:00'), 'achilles'): 66.06214285714287,
 (Timestamp('2019-10-31 00:00:00'), 'acm'): 25.69666666666667,
 (Timestamp('2019-10-31 00:00:00'), 'acme'): 48.95154761904759,
 (Timestamp('2019-10-31 00:00:00'), 'acqua'): 2.96,
 (Timestamp('2019-10-31 00:00:00'), 'acron'): 15.42,
 (Timestamp('2019-10-31 00:00:00'), 'activision'): 45.31161290322581
  

Вместо этого я хотел бы иметь что-то вроде:

 {2019-10-31: {'a-case': 4.745862068965517, 'a-derma': 12.36, 'a-mega': 114.60777777777781},
2019-11-30:  {'a-case': 272.305714, 'a-derma': 79.501161, 'a-mega': 11.970000}}

  

Возможно ли это?? Причина также в том, что, поскольку у меня есть только один столбец, python преобразовал мой объект DataFrameGroupBy в серию, поэтому я не могу использовать .get_group()!!

Ответ №1:

Это должно сработать:

 pd.DataFrame(sub_df.groupby(by=["event_time", "brand"])["price"].mean()).reset_index().set_index("event_time").T.to_dict()
  

Вот как это выглядело в моих тестовых данных:
введите описание изображения здесь