#python #pandas #dictionary #dataframe #nested
#python #pandas #словарь #фрейм данных #вложенный
Вопрос:
У меня много фреймов данных с такими именами, как ‘ABC’, ‘XYZ’…
У меня также есть словарь с ключами, где каждый ключ содержит список из 200 значений, которые являются именами фреймов данных, т.е. [‘ABC’,’XYZ’, …]
Я хочу обновить этот словарь, поэтому вместо того, чтобы содержать имена фреймов данных, он содержит сами фреймы данных в виде вложенного словаря.
Это позволит мне перебирать определенный ключ основного словаря словаря и получать доступ к каждому из его 200 фреймов данных по имени
т.е. dictionary[key1][ABC] распечатал бы фрейм данных ABC.
Есть идеи? 🙂
Ответ №1:
Достаточно просто, используйте eval
:
u, v, w, x, y, z = 1, 2, 3, 4, 5, 6
frames = {}
names = {'a' : ['u', 'v'],
'b' : ['w', 'x'],
'c' : ['y', 'z']}
for key in names:
frames[key] = dict(zip(names[key], [eval(name) for name in names[key]]))
frames
# Output:
{'a': [1, 2], 'b': [3, 4], 'c': [5, 6]}
Комментарии:
1. Почти, я думаю, OP хочет получить {‘a’: {‘1’:1, ‘2’:2} … }
2. Да, @Boud, мой недосмотр. Я соответствующим образом отредактирую ответ.
3. Спасибо за ваш ответ, хотя я изо всех сил пытаюсь его понять.. где здесь фреймы данных?
4. думаю, я понял ..!
5. @cwse, Отлично! Я планировал написать объяснение, когда увидел ваш первый комментарий, и теперь, когда я, наконец, собрался это сделать, похоже, вы сами разобрались. Я просто избавил себя от скуки создания
DataFrame
и вместо этого использовалint
в своем ответе. В принципе, все, что вы можете назначить переменной, может быть извлечено таким образом. Даже такие выражения, какeval(x y)
будут работать, используя значения вx
иy
, и в этом случае возвращают 9 .
Ответ №2:
Какие ключи в настоящее время находятся в этом словаре? / Где в настоящее время хранятся ваши фреймы данных? Вероятно, вы хотите что-то вроде этого:
dfDict ={dfName: <df>} #assuming a bit here
newDict = {}
for key, value in oldDict.items():
newDict[key] = { dfName:dfDict[dfName] for dfName in value }
Комментарии:
1. Ключи, которые в настоящее время находятся в словаре, представляют собой строки даты. Фреймы данных в настоящее время хранятся в другом массивном словаре
2. Я советую соблюдать осторожность, логика в этом утверждении:
newDict[key] = { dfName:dfDict[dfName] for dfName in value }
останетсяnewDict[key]
только последняя запись в спискеvalue
. Он не добавляется для формирования спискаnewDict[key]
.3. Я считаю, что это разница в интерпретации вопроса. У меня сложилось впечатление, что cwse хотела конечную структуру данных: {date : { dfName: df, dfName2: df2, … } . Мой ответ не возвращает список, а только вложенный словарь.
4. @Kartik Я думаю, что этот метод на самом деле делает правильные вещи более коротким способом, он не требует EVAL (который, как я читал, может иметь проблемы с безопасностью, и его следует избегать). Спасибо вам обоим за ваши усилия здесь!