2016-10-23 7 views
0

Ich versuche, einen Pandas-Datenrahmen aus einer .npy-Datei zu machen, die, wenn sie mit np.load eingelesen wird, ein numpy-Array mit einem Wörterbuch zurückgibt. Mein erster Instinkt war, das Wörterbuch zu extrahieren und dann einen Datenrahmen mit pd.from_dict zu erstellen, aber das scheitert jedes Mal, weil ich nicht das Wörterbuch aus dem Array, das von np.load zurückgegeben wurde, zu bekommen scheint. Es sieht so aus, als wäre es nur np.array ([dictionary, dtype = object]), aber ich kann das Wörterbuch nicht durch Indexieren des Arrays oder so etwas erhalten. Ich habe auch versucht, np.load ('filename'). Item() zu verwenden, aber das Ergebnis wird immer noch nicht von Pandas als Wörterbuch erkannt.Erstellen eines Pandas-Datenrahmens aus einer .npy-Datei

Alternativ habe ich versucht pd.read_pickle und das hat auch nicht funktioniert.

Wie kann ich dieses .npy-Wörterbuch in meinen Dataframe bekommen? Hier ist der Code, andernfalls hält ...

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 
+0

Wie haben Sie die '.npy' Datei erstellt? ist es mit 'np.save()' – Grainier

+0

Es wurde mir nur leider gegeben. Mir wurde gesagt, dass ich mit np.load das bekommen könnte, was ich brauchte. – Arnold

+0

Sollte es nicht 'pd.DataFrame.from_dict' statt' pd.from_dict' sein? Zumindest in "Pandas 0.18.1" existiert letzteres nicht. Wie auch immer, sind Sie sicher, dass das Problem mit der '.npy' Datei auftritt? Ich kann Wörterbücher mit 'np.save' und' np.load' erfolgreich speichern und laden. Könnten Sie Details über 'file_dict' sowie die Fehlermeldungen posten? –

Antwort

1

Nehmen wir an, sobald Sie die .npy laden, das Element (np.load(path_to_use).item()) sieht wie folgt aus;

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

Also, wenn Sie mit einem DataFrame kommen müssen, wie unten unter Verwendung des obigen Wörterbuchs;

user_name user_id 
0 user_c id_003 
1 user_a id_001 
2 user_b id_002 

Sie können verwenden;

df = pd.DataFrame(list(x.item().iteritems()), columns=['user_name','user_id']) 

Wenn Sie eine Liste der Wörterbücher wie unten;

users = [{'u_name': 'user_a', 'u_id': 'id_001'}, {'u_name': 'user_b', 'u_id': 'id_002'}] 

Sie können einfach verwenden

df = pd.DataFrame(users) 

mit einem Datenrahmen zu kommen ähnlichen;

 u_id u_name 
0 id_001 user_a 
1 id_002 user_b 

Scheint, wie Sie ein Wörterbuch ähnlich wie diese haben;

data = { 
    'Center': [[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]], 
    'Vpeak': [1.1, 2.2], 
    'ID': ['id_001', 'id_002'] 
} 

In diesem Fall können Sie einfach verwenden;

df = pd.DataFrame(data) # df = pd.DataFrame(file_dict.item()) in your case 

Um mit einem Datenrahmen ähnlich zu kommen;

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 

Wenn Sie ndarray im dict haben, tun einige auf unter ähnlichen Vorverarbeitung; und benutze es um das df zu erstellen;

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

df = pd.DataFrame(data) 
+0

Okay, also funktioniert dein erster Vorschlag, außer dass ich mich wundere, ob es einen Weg gibt, alle Schlüsselspaltenköpfe zu erstellen, ohne sie einzeln zu spezifizieren? Weil es eine Menge von ihnen gibt und es standardmäßig jedes als eine Reihe setzt. Ich danke dir sehr! – Arnold

+0

Mit nur file_dict = np.load (path_to_use) und dann df = pd.DataFrame (liste (file_dict.item(). Iteritems())), was ich bekomme ist [diese.] (Http://imgur.com/ a/nVjNE) – Arnold

+0

@Rebecca, können Sie die Ausgabe von 'file_dict.item()' anstelle von df teilen? – Grainier

Verwandte Themen