У меня есть следующий код для создания словаря фреймов данных с использованием csv файлов:
l = ['employees','positions']
d = {}
for x in l:
d[x] = pd.read_csv("P:\\python_work\\data_sets\\" + x + ".csv")
Как бы я сделал то же самое, используя список фреймов данных, которые уже существуют в памяти?
Это не работает, но, возможно, это помогает прояснить, что я пытаюсь сделать:
l = ['df1','df2']
d = {}
for x in l:
d[x] = x
Тогда я мог бы получить доступ к отдельным кадрам данных следующим образом:
d['df1']
Я привел пример, используя csv файлы, потому что он работает, и он имеет тот же конечный результат (словарь кадров данных).
Здесь пример желаемого содержимого словаря:
{'employees': id name date
0 1 bob 1/1/2018
1 2 sally 1/2/2018, 'positions': pos desc status
0 12454 director a
1 65444 manager i}
Я хочу использовать список существующих фреймов данных, а не csv файлов. Я попытался использовать список без кавычек, но получаю сообщение об ошибке:
l = [employees, positions]
d = {}
for x in l:
d[x] = x
... но я получаю эту ошибку:
TypeError: 'DataFrame' objects are mutable, thus they cannot be hashed
Проблема в том, что вы определяете список строк и строите словарь, отображающий каждую строку для себя. Гораздо проще использовать enumerate
с итерабельными данными. Предполагая, что df1
и df2
являются df2
данных:
d = dict(enumerate((df1, df2), 1))
Затем получите доступ к вашим данным с помощью d[1]
и d[2]
. Если вы действительно хотите, чтобы ваши ключи были строками "df1"
и "df2"
, вы можете использовать понимание словаря:
d = {'df'+str(i): j for i, j in enumerate((df1, df2), 1)}
Лучшее соглашение об именах, на мой взгляд, заключается в использовании ваших имен файлов в качестве ключей:
files = ['employees', 'positions']
d = {f: pd.read_csv(f'P:\\python_work\\data_sets\\{f}.csv') for f in files}
eval
, используйте globals
, используйте locals
. Что вы можете сделать, это прочитать кадры данных прямо в словарь, например, d = {}; d['employees'] = pd.read_csv(...)
.
Уже имеется словарь со всеми объявленными переменными в памяти, доступными через locals()
или встроенные функции globals()
, в зависимости от того, определены ли эти кадры как локальные или глобальные переменные. Вы должны иметь доступ к своему DataFrame как таковому:
locals()['df1']
globals()
для этой цели не рекомендуется, см. Stackoverflow.com/questions/1373164/…
Вы почти там, я добавил k
чтобы показать, как вы должны использовать перечисление в этом случае
l = ['employees','positions']
k = [1,2]
d = {}
for index,x in enumerate(l):
d[x] = k[index]
Возвращает для d:
{'employees': 1, 'positions': 2}
Чем избыток данных вы:
df_1 = d.get('employees')
(конечно, вам нужно заменить k [index] на создание вашего фрейма данных)
df1
иdf2
являются переменными в глобальном пространстве имен, вы можете получить к ним доступ, используяglobals()['df1']
и т. Д. Хотя при загрузке их лучше хранить их в словаре.