#python #pandas #dictionary #pickle
#python #pandas #словарь #рассол
Вопрос:
Я пытаюсь создать фрейм данных pandas из файла .npy, который при чтении с помощью np.load возвращает массив numpy, содержащий словарь. Моим первоначальным побуждением было извлечь словарь, а затем создать фрейм данных с помощью pd.from_dict , но каждый раз это приводит к сбою, потому что я, похоже, не могу извлечь словарь из массива, возвращаемого из np.load. Похоже, что это просто np.array ([dictionary, dtype=object]), но я не могу получить словарь путем индексации массива или чего-либо подобного. Я также пробовал использовать np.load(‘filename’).item(), но результат по-прежнему не распознается pandas как словарь.
В качестве альтернативы я попробовал pd.read_pickle, и это тоже не сработало.
Как я могу вставить этот словарь .npy в свой фрейм данных? Вот код, который продолжает давать сбой…
import pandas as pd
import numpy as np
import os
targetdir = '../test_dir/'
filenames = []
successful = []
unsuccessful = []
for dirs, subdirs, files in os.walk(targetdir):
for name in files:
filenames.append(name)
path_to_use = os.path.join(dirs, name)
if path_to_use.endswith('.npy'):
try:
file_dict = np.load(path_to_use).item()
df = pd.from_dict(file_dict)
#df = pd.read_pickle(path_to_use)
successful.append(path_to_use)
except:
unsuccessful.append(path_to_use)
continue
print str(len(successful)) " files were loaded successfully!"
print "The following files were not loaded:"
for item in unsuccessful:
print item "n"
print df
Комментарии:
1. Как вы создали
.npy
файл? использует ли этоnp.save()
2. К сожалению, это было просто дано мне. Мне сказали, что я могу получить из него то, что мне нужно, используя np.load.
3. Разве это не должно быть
pd.DataFrame.from_dict
вместоpd.from_dict
? По крайней мере, вpandas 0.18.1
последнем не существует. В любом случае, вы уверены, что проблема в.npy
файле? Я могу успешно сохранять и загружать словари с помощьюnp.save
иnp.load
. Не могли бы вы опубликовать подробную информацию оfile_dict
, а также сообщения об ошибках?4. Вы правы насчет pd.DataFrame.from_dict()! Однако, когда я указываю этот аргумент x, где x = np.load(path_to_use).item(), я получаю сообщение об ошибке «Исключение: данные должны быть одномерными». Вот небольшая часть того, что я вижу при печати x.
Ответ №1:
Давайте предположим, что после загрузки .npy
элемент ( np.load(path_to_use).item()
) выглядит примерно так;
{'user_c': 'id_003', 'user_a': 'id_001', 'user_b': 'id_002'}
Итак, если вам нужно создать фрейм данных, подобный приведенному ниже, используя приведенный выше словарь;
user_name user_id
0 user_c id_003
1 user_a id_001
2 user_b id_002
Вы можете использовать;
df = pd.DataFrame(list(x.item().iteritems()), columns=['user_name','user_id'])
Если у вас есть список словарей, подобных приведенному ниже;
users = [{'u_name': 'user_a', 'u_id': 'id_001'}, {'u_name': 'user_b', 'u_id': 'id_002'}]
Вы можете просто использовать
df = pd.DataFrame(users)
Чтобы создать фрейм данных, подобный;
u_id u_name
0 id_001 user_a
1 id_002 user_b
Похоже, у вас есть словарь, похожий на этот;
data = {
'Center': [[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]],
'Vpeak': [1.1, 2.2],
'ID': ['id_001', 'id_002']
}
В этом случае вы можете просто использовать;
df = pd.DataFrame(data) # df = pd.DataFrame(file_dict.item()) in your case
Чтобы создать фрейм данных, подобный;
Center ID Vpeak
0 [0.1, 0.2, 0.3] id_001 1.1
1 [0.4, 0.5, 0.6] id_002 2.2
Если у вас есть ndarray
в dict, выполните некоторую предварительную обработку, аналогичную приведенной ниже; и используйте ее для создания df;
for key in data:
if isinstance(data[key], np.ndarray):
data[key] = data[key].tolist()
df = pd.DataFrame(data)
Комментарии:
1. Хорошо, итак, ваше первое предложение работает, за исключением того, что мне интересно, есть ли способ создать заголовки всех столбцов keys без указания каждого по отдельности? Потому что их много, и по умолчанию каждый помещается в строку. Большое вам спасибо!
2. Используя только file_dict = np.load(path_to_use), а затем df = pd.DataFrame(список(file_dict.item().iteritems())), я получаю это.
3. @Rebecca, ты можешь поделиться выводом
file_dict.item()
вместо df?4. Он огромен и запатентован, но вот краткое представление об этом. Я немного повозился с этим, и я думаю, что одна из проблем заключается в том, что некоторые ключи, такие как ‘Center’, имеют значения, которые на самом деле являются списками координат, которые pandas не понимает, как анализировать. Я нашел несколько медленных способов их индексирования и добавления, но должен быть способ получше…
5. @Rebecca пожалуйста, обратитесь к обновленному ответу, надеюсь, это может помочь