Это зависит от того, что вы хотите.
Лучшим способом является, вероятно, не, чтобы использовать вложенные списки, а вместо этого использовать словари. Поскольку вы упомянули pandas, объекты pandas DataFrame имеют функцию to_dict
, которая преобразует DataFrame в словарь, и есть несколько вариантов в зависимости от того, что вы предпочитаете.
Из вашего примера видно, что вы пытаетесь создать свою структуру данных с повторяющимися индексами. Лучший вариант здесь, скорее всего, будет использовать структуру, созданную при запуске df.to_dict("split")
.
Произнесите DataFrame (ДФ) выглядит следующим образом:
3 1 2 4
2 0 0 0 0
1 0 0 0 0
2 0 0 0 0
1 0 0 0 0
Запуск `df.to_dict ("сплит") будет делать это:
d = df.to_dict("split")
{
'columns': [3, 1, 2, 4],
'data': [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]],
'index': [2, 1, 2, 1]
}
Доступ к данным в этом сценарии, и в том, что показано @Makiflow, сложно. Даже внутри Pandas наличие дублирующих индексов или столбцов на вашем Dataframe делает операции более интересными. В этом случае выбор df['data'][3][1]
выбирает второй элемент в третьем списке, содержащий ключ data
. Это фактически выбор четвертой строки и второго столбца вашей матрицы. Если вы хотите, чтобы иметь возможность ссылаться на столбец имя, вам нужно сделать немного больше работы с ногами.
Вы можете запустить col_num = d['columns'].index(3)
, который даст вам значение индекса элемента 3
, но выполнение d['index'].index(2)
всегда даст вам 0, даже если вы захотите выбрать 2 по индексу 3.Это потому, что index()
возвращает индекс первого значения, соответствующего условию. Разумеется, вы можете просто выбрать кортежи индексов (col, row), но это в первую очередь приведет к тому, что имена столбцов и индексов будут проигнорированы.
Если вы хотите создать эту структуру без панд, вы можете запустить: COLS, ROWS = 5, 5 столбцы = [random.randint (0, COLS) для _ в диапазоне (COLS)] строк = [ random.randint (1,2) для _ в диапазоне (ROWS)]
d = {"columns": columns,
"index": rows,
"data": [[0 for _ in range(COLS)] for _ in range(ROWS)]
}
ИМХО - лучшее решение будет фактически заставить вашу структуру данных, чтобы иметь уникальный индекс и столбцы значений. Выход по умолчанию to_dict()
будет выводить очень просто словарь:
d = df.to_dict() # also the same as df.to_dict("dict")
{
1: {1: 0, 2: 0},
2: {1: 0, 2: 0},
3: {1: 0, 2: 0},
4: {1: 0, 2: 0}
}
В этой конфигурации каждый ключ к словарю это имя столбца. Каждый из этих ключей указывает на другой дубликат, который представляет информацию в этом столбце - каждый ключ является значением индекса, за которым следует значение.
Это, вероятно, делает наиболее интуитивный смысл, потому что если вы хотите, чтобы получить значение в столбце имени 3 по индексу имени 1, вы могли бы сделать:
d = df.to_dict()
d[3][1]
# 0
Вы можете создать эти данные структура без использования Панд просто:
COLS, ROWS = 5,5
rows = [i for i in range(ROWS)]
columns = [i for in range(COLS)]
{c : {i:0 for i in rows} for c in columns}
# {
# 0: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0},
# 1: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0},
# 2: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0},
# 3: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0},
# 4: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0}
# }
Это действительно зависит от ограничений/требований, которые у вас есть.