Преобразование диапазона ячеек в словарь Python

#python #excel #pandas #dataframe

#python #excel #панды #фрейм данных

Вопрос:

У меня есть таблица из 5 столбцов в Excel, в которой я хочу, чтобы каждая строка в крайнем левом столбце (‘A’ или 0) была ключом, а 4 последующих столбца в этой строке были значениями.

пока у меня есть:

 call_data = CallData.to_dict()
call_data.index('A').to_dict(orient='index')
print(call_data)
  

Это делает заголовок каждого столбца ключевым, а все строки ниже (28) значениями. Есть ли способ изменить это? Я погуглил свое сердце.

Вот как выглядит таблица для 28 строк. Столбец A — это тот, который я хочу сделать ключевым.

 A     | B      |C      |D       |E 
Jan-15| 800    |6.47   |530,000 |1.6
  

РЕДАКТИРОВАТЬ 3:

Я получаю эту (НОВУЮ) ошибку при запуске кода сейчас:

 Traceback (most recent call last):
  File "D:/Personal Files/Technical Development/PycharmProjects/Call Center Headcount Model/Call Center Headcount Model.py", line 52, in <module>
    dict_result = call_data.set_index('A').to_dict(orient='index')
  File "C:anaconda3envsEnviromentlibsite-packagespandascoreframe.py", line 4303, in set_index
    raise KeyError(f"None of {missing} are in the columns")
KeyError: "None of ['A'] are in the columns"
  

Код:

     SpreadSheetData = pd.read_excel(
    FilePath   'Call Center Work Rules.xlsx',
    sheet_name='Data Agg.')

    call_data = SpreadSheetData
    dict_result = call_data.set_index('A').to_dict(orient='index')
  

это то, что Fram данных печатает в точности: Print(SpreadSheetData)

     Date    Calls  AVG Call Time  Total Call Time        Orders
0  2015-01-31  82034.0       6.471024    530843.967784  1.633581e 06
1  2015-02-28  78007.5       6.743146    526015.928294  6.534326e 05
2  2015-03-31  84425.5       6.608714    557943.983912  9.801489e 05
3  2015-04-30  71089.0       6.959075    494713.692979  8.478081e 05
4  2015-05-31  77414.0       6.732396    521181.717775  1.186931e 06
5  2015-06-30  86811.0       6.999769    607656.979210  1.356493e 06
6  2015-07-31  81995.0       7.051137    578157.977305  1.861042e 06
7  2015-08-31  62538.0       7.995746    500037.935402  1.116625e 06
8  2015-09-30  45677.5       7.885182    360175.378283  7.444169e 05
9  2015-10-31  52542.0       8.083627    424729.950838  1.000827e 06
10 2015-11-30  51352.0       7.608637    390718.717376  1.751447e 06
11 2015-12-31  58871.0       7.675463    451862.183771  2.251861e 06
12 2016-01-31  68664.0       7.745629    531845.879620  1.712810e 06
13 2016-02-29  74043.5       7.937032    587685.592567  6.851241e 05
14 2016-03-31  77155.0       8.221454    634326.306777  1.027686e 06
15 2016-04-30  60979.5       8.059682    491475.397091  8.889268e 05
16 2016-05-31  69163.0       7.885619    545393.085653  1.244498e 06
17 2016-06-30  90276.0       8.508960    768154.893931  1.422283e 06
18 2016-07-31  90854.5       8.506498    772853.621003  1.951303e 06
19 2016-08-31  72722.5       7.479822    543951.323850  1.170782e 06
20 2016-09-30  54339.0       7.215742    392096.181983  7.805211e 05
21 2016-10-31  68084.0       7.705519    524622.580078  1.049367e 06
22 2016-11-30  58564.0       7.066731    413856.014456  1.836393e 06
23 2016-12-31  63573.0       7.420257    471727.986085  2.361076e 06
24 2017-01-31  71665.5       7.527221    539442.083982  1.796311e 06
25 2017-02-28  62583.5       7.295476    456576.395666  7.185243e 05
26 2017-03-31  76385.5       7.317654    558962.634577  1.077786e 06
27 2017-04-30  69727.5       7.330732    511153.636251  9.322625e 05
28 2017-05-31  81249.5       7.247624    588865.803177  1.305168e 06
  

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

1. Вы пытаетесь создать dict таким образом, чтобы {'Jan-15': [800, 6.47, 530000, 1.6]} ? И зная, что у вас есть несколько строк, вы будете иметь их в виде списка, например [{'Jan-15': [800, 6.47, 530000, 1.6}], { ...}] ?

2. Да, точно. Я хочу иметь возможность получать доступ к определенному значению из каждого ключа, когда это необходимо, и считал это оптимальным способом. Также я должен уточнить, что «CallData» — это рабочий лист, доступ к которому осуществляется через pandas

3. Таким CallData образом, предполагается, что это уже фрейм данных. Можете ли вы попробовать CallData.set_index('A').to_dict(orient='index') ?

4. Только что отредактировал сообщение. Получил еще одну ошибку.

5. Возможно, вы захотите распечатать эти данные вызова перед установкой индекса, просто чтобы убедиться, что все в порядке. Не могли бы вы распечатать часть фрейма данных?

Ответ №1:

Попробуй это:

 dict_result = call_data.set_index('A').to_dict(orient='index')
  

Пример:

 call_data = pd.DataFrame([
    [2,2,3,4,5],
    [1,2,3,4,5],
    [6,2,3,4,5],
    [7,2,3,4,5]

], columns=['A', 'B', 'C', 'D', 'E'])


dict_result = call_data.set_index('A').to_dict(orient='index')

for k, v in dict_result.items():
    print(k, v)

2 {'B': 2, 'C': 3, 'D': 4, 'E': 5}
1 {'B': 2, 'C': 3, 'D': 4, 'E': 5}
6 {'B': 2, 'C': 3, 'D': 4, 'E': 5}
7 {'B': 2, 'C': 3, 'D': 4, 'E': 5}
  

В случае, если вы хотите найти другой формат, вы можете просмотреть дополнительные параметры, указав:

 print(help(call_data.to_dict))
  

Где вы можете увидеть более подробную информацию:

   Parameters
    ----------
    orient : str {'dict', 'list', 'series', 'split', 'records', 'index'}
        Determines the type of the values of the dictionary.
    
        - 'dict' (default) : dict like {column -> {index -> value}}
        - 'list' : dict like {column -> [values]}
        - 'series' : dict like {column -> Series(values)}
        - 'split' : dict like
          {'index' -> [index], 'columns' -> [columns], 'data' -> [values]}
        - 'records' : list like
          [{column -> value}, ... , {column -> value}]
        - 'index' : dict like {index -> {column -> value}}
  

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

1. Просто имейте в виду, что это выдаст ошибку, если столбец не является уникальным.

2. Я отредактировал свой код выше, но я не думаю, что сделал это правильно, так как получаю эту ошибку: Трассировка (последний последний вызов): File «D:/Personal Файлы/Техническое развитие/PycharmProjects/Модель численности персонала колл-центра/Численность персонала колл-центра Model.py «, строка 50, в <module> call_data.index(‘A’).to_dict(orient=’index’) Ошибка атрибута: объект ‘dict’ не имеет атрибута ‘index’

3. Возможно, вы захотите опубликовать полученное сообщение об ошибке

4. попробуйте set_index('A') вместо того, чтобы просто index('A')

5. Отредактировал мой пост og