【问题标题】:Making a pandas dataframe from a .npy file从 .npy 文件制作 pandas 数据框
【发布时间】:2017-03-05 04:54:00
【问题描述】:

我正在尝试从一个 .npy 文件中创建一个 pandas 数据帧,当使用 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

【问题讨论】:

  • 您是如何创建.npy 文件的?是否使用np.save()
  • 不幸的是,它只是给了我。有人告诉我,我可以使用 np.load 从中得到我需要的东西。
  • 不应该是pd.DataFrame.from_dict而不是pd.from_dict吗?至少在pandas 0.18.1 中,后者不存在。无论哪种方式,您确定问题出在.npy 文件上吗?我可以使用np.savenp.load 成功保存和加载字典。您能否发布有关file_dict 的详细信息以及错误消息?
  • 你是对的 pd.DataFrame.from_dict()!但是,当我给出参数 x where x = np.load(path_to_use).item() 时,我收到一条错误消息,提示“异常:数据必须是一维的”。 Here's 打印 x 时看到的一小部分。

标签: python pandas dictionary pickle


【解决方案1】:

假设一旦您加载了.npy,项目 (np.load(path_to_use).item()) 看起来与此类似;

{'user_c': 'id_003', 'user_a': 'id_001', 'user_b': 'id_002'}

所以,如果你需要使用上面的字典想出一个像下面这样的 DataFrame;

  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)

想出一个类似的DataFrame;

     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

想出一个类似的DataFrame;

    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,做一些类似于下面的预处理;并用它来创建df;

for key in data:
    if isinstance(data[key], np.ndarray):
        data[key] = data[key].tolist()

df = pd.DataFrame(data)

【讨论】:

  • 好的,所以您的第一个建议有效,除了我想知道是否有一种方法可以在不单独指定每个键的情况下制作所有键列标题?因为它们有很多,并且默认将每个都排成一行。非常感谢!
  • 只有 file_dict = np.load(path_to_use) 然后 df = pd.DataFrame(list(file_dict.item().iteritems())),我得到的是this.
  • @Rebecca,你能分享file_dict.item()的输出而不是df吗?
  • 它庞大且专有,但here's 一瞥。我一直在搞乱它,我认为问题之一是像“Center”这样的一些键的值实际上是熊猫不理解如何解析的坐标列表。我发现了一些缓慢的方法来索引和添加它们,但必须有更好的方法......
  • @Rebecca 请参考更新后的答案,希望对您有所帮助
猜你喜欢
  • 2019-08-12
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 2022-11-24
  • 1970-01-01
  • 2021-09-05
相关资源
最近更新 更多