Создание фрейма данных pandas из файла .npy

#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 пожалуйста, обратитесь к обновленному ответу, надеюсь, это может помочь