2016-09-01 2 views
0

Я создал диктофон, структурированный таким образом, что ключ - это отдел («ABC»), тогда дата (01.08) является ключом, а значения - {имя продукта (A), Единицы (0), Доход (0)}. Эта структура продолжается для нескольких отделов. См. Диктовую распечатку dict.Append dataframe to dict

'ABC':                 01.08 \ 


A.   Units   0 
              Revenue    0 
B.   Units   0 
              Revenue    0 
C.   Units   0 
              Revenue    0 
D.   Units   0 
              Revenue    0 

Кроме того, я создал dataframe используя GroupBy и функцию агрегации (сумма), чтобы получить общее количество единиц и дохода в день на отдел (это объединение двух уровней, в отличие от трех в dict - date, department, product).

Распечатка ДФ, которая представляет собой совокупность ряда единиц и общего дохода, приводит к:

print df.ix['ABC'] 

         Total Overall Units \ 
dates 
2016-08-01     2 
2016-08-02     0 
2016-08-03     2 
2016-08-04     1 
2016-08-22     2 

         Total Overall Revenue \ 
dates 
2016-08-01    20 
2016-08-02    500 
2016-08-03    39 
2016-08-04    50 

Сейчас я заканчивающиеся с двумя отдельными объектами, которые я хочу, чтобы объединить/добавить, так что общее единицы и общий доход будут добавлены к концу dict в правильном месте (т.е. сопоставлены с правильным департаментом и датой). В настоящее время я печатаю dict, а затем dataframe pd.to html отдельно по 'department', поэтому я остаюсь с двумя отдельными таблицами. Они не только разделяются, но и таблица, созданная из df, также имеет один меньше столбцов, поскольку они сгруппированы по-разному.

'ABC': 
         01.08 | 02.08 | 03.08 | 04.08 
A  Total Units  0   0   0   0 
     Total Revenue  0   0   0   0 
B  Total Units  0   0   0   0 
     Total Revenue  0   0   0   0 
C  Total Units  0   0   0   0 
     Total Revenue  0   0   0   0 
D  Total Units  0   0   0   0 
     Total Revenue  0   0   0   0 
    Total Overall Units 0   0   0   0 
    Total Overall Revenue 0   0   0   0 
  1. Могу ли я добавить dataframe в Словаре по 'название отдела'?
  2. Конечная цель - объединить эти два объекта данных в один единый объект данных или буквально выровнять объекты для удобства чтения.

Любые идеи?

ответ

0

Переход к вопросу № 2: Я бы рекомендовал использовать единый блок данных для хранения всей вашей информации. С ними будет работать намного легче, чем сохранение столбчатых данных в dict dict. Установите дату в качестве основного индекса и либо используйте отдельный столбец для каждого поля («deptA-income»), либо используйте мультииндексирование. Затем вы можете хранить ежедневные итоговые значения в виде столбцов в одном и том же фрейме.

+0

@ Sophier Dane. Я вижу вашу мысль. Учитывая, что формат dict и dataframe, показанный в исходном сообщении, создаются из одного основного фрейма. Как бы вы тогда агрегировали общие единицы и доход в день на департамент и продукт, а затем только днем ​​и депарацией? – OAK

+0

Лучший ответ, вероятно, зависит от структуры исходного фрейма. Вы можете группировать по дням на разных уровнях, а затем объединять разные группы. Отсутствие того, что вы можете выполнять итерацию по определенным спискам столбцов. df ['Revenue_col'] = 0 для col в income_columns_to_aggregate: df ['Revenue_col'] + = df [col] –

0

Чтобы напечатать в нужном порядке, вам необходимо транспонировать строки & столбцов в словаре дат. Вероятно, проще всего суммировать строки при этом. Это делает второй объект, о котором вы упоминали, лишний. За исключением форматирования, что-то вроде этого должно работать:

for dept, dates in df.items(): 

    # Transpose the rows and columns into two new dictionaries 
    # called units and revenue. At the same time, total the 
    # units and revenue into two new "zztotal" entries. 

    units = { "zztotal" : {}} 
    revenues = { "zztotal" : {}} 
    for date, products in dates.items(): 
     for product, stats in products.items(): 
      name = stats["name"] 

      if not name in units: 
       units[name] = {} 
       revenues[name] = {} 
      units[name][date] = stats["units"] 
      revenue[name][date] = stats["revenue"] 

      if not date in units["zztotal"]: 
       units["zztotal"][date] = 0 
       revenue["zztotal"][date] = 0 
      units["zzotal"][date] += stats["units"] 
      revenue["zzotal"][date] += stats["revenue"} 

    # At this point we are ready to print the transposed 
    # dictionaries. Work is needed to line up the columns 
    # so the printout is attractive. 

    print dept 
    print sorted(dates.keys()) 
    for name, dates in sorted(units.items()): 
     if name != "zztotal": 
      print name, "Total Units", [ 
       units[date] for date in sorted(dates)] 
      print "Total Revenue", [ 
       revenue[date] for date in sorted(dates)] 
     else: 
      print "Total Overall Units", [ 
       units[date] for date in sorted(dates)] 
      print "Total Overall Revenue", [ 
       revenue[date] for date in sorted(dates)] 
+0

Я чувствую себя глупо. Я должен был найти данные, прежде чем я разместил это. Я не понимал, что это формальная структура данных. Однако я собираюсь оставить это в надежде, что это будет полезно. –