Словарь датафреймов из существующих фреймов данных

1

У меня есть следующий код для создания словаря фреймов данных с использованием 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
  • 1
    что не работает с этим?
  • 0
    Если df1 и df2 являются переменными в глобальном пространстве имен, вы можете получить к ним доступ, используя globals()['df1'] и т. Д. Хотя при загрузке их лучше хранить их в словаре.
Показать ещё 3 комментария
Теги:
pandas
csv
dataframe
dictionary

3 ответа

1

Проблема в том, что вы определяете список строк и строите словарь, отображающий каждую строку для себя. Гораздо проще использовать 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}
  • 0
    Я хочу использовать опцию, аналогичную той, в которой вы используете имена файлов в качестве ключей, но я хочу использовать имена фреймов данных в качестве ключей (т. Е. Сотрудники и должности являются существующими фреймами данных, а не файлами CSV).
  • 0
    @Dread, так пример в твоем вопросе не очень точный? Вот вещи, которые вы не должны делать: используйте eval , используйте globals , используйте locals . Что вы можете сделать, это прочитать кадры данных прямо в словарь, например, d = {}; d['employees'] = pd.read_csv(...) .
0

Уже имеется словарь со всеми объявленными переменными в памяти, доступными через locals() или встроенные функции globals(), в зависимости от того, определены ли эти кадры как локальные или глобальные переменные. Вы должны иметь доступ к своему DataFrame как таковому:

locals()['df1']
  • 1
    На мой взгляд, использование globals() для этой цели не рекомендуется, см. Stackoverflow.com/questions/1373164/…
0

Вы почти там, я добавил 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] на создание вашего фрейма данных)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню