Python обновляет значения словаря, чтобы ссылаться на фреймы данных с тем же именем

#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 (который, как я читал, может иметь проблемы с безопасностью, и его следует избегать). Спасибо вам обоим за ваши усилия здесь!