Словарь датафреймов из существующих фреймов данных - PullRequest
0 голосов
/ 03 июля 2018

У меня есть следующий код для создания словаря фреймов данных с использованием 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

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

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

locals()['df1']
0 голосов
/ 03 июля 2018

Вы почти там, я добавил k, чтобы показать, как вы должны использовать enumerate в этом случае

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] созданием вашего фрейма данных)

0 голосов
/ 03 июля 2018

Проблема в том, что вы определяете список строк и строите словарь, отображающий каждую строку в себя. Гораздо проще использовать enumerate с итерируемым фреймом данных. Предполагая, что df1 и 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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...