2016-04-28 12 views
0

ich mehrere .txt Dateien in einem Unterverzeichnis haben, /subdirect/Wie entpacken Sie ein Pandas-Panel mit einem Wörterbuch erstellt?

Diese Dateien

file1.txt 
file2.txt 
file3.txt 
file4.txt 
... 

Mit glob, kann ich diese in einem dreidimensionalen Panel, mit dem Dateinamen als Schlüssel für die Schlüssel-Wert setzen Paare.

Jetzt möchte ich diese Dateien entpacken, um jeden Dataframe einzeln zu bearbeiten und Daten zu plotten.

Allerdings scheint ich das Panel nicht richtig auszupacken, da sich die Abmessungen komplett geändert haben.

Wie entpackt man ein Pandas Panel?

Antwort

1

Wie wäre es, die Datendateien einzeln anstatt zu lesen, da Sie nicht per se in der Panel Struktur interessiert zu sein scheinen:

import glob 
import pandas as pd 

for filename in glob.glob('*.txt'): 
    df = pd.read_csv(filename) 
    df['total_sum'] = df[["column1", "column2", "column3"]].sum(axis=1) # sum total reads 
    df.plot(kind='bar') 

Alternativ nehmen Sie einen Blick auf pd.Panel.to_frame()Panel zu DataFrame zu konvertieren. Zum Beispiel mit einem Panel von einem dict mit zwei DataFrames:

df = pd.DataFrame(np.random.random(size=(20, 10))) 

panel = pd.Panel.from_dict({'1': df, '2': df.add(10)}) 

<class 'pandas.core.panel.Panel'> 
Dimensions: 2 (items) x 20 (major_axis) x 10 (minor_axis) 
Items axis: 1 to 2 
Major_axis axis: 0 to 19 
Minor_axis axis: 0 to 9 

to_frame() Mit bekommt man eine Langformat DataFrame mit zwei Spalten und ein MultiIndex mit einer Länge von row x column. Plotten, könnten Sie die columns von data_frame iterieren .items() und verwenden .unstack() in andere Formate zu konvertieren geeignet zum Plotten:

data_frame = panel.to_frame() 

MultiIndex: 200 entries, (0, 0) to (19, 9) 
Data columns (total 2 columns): 
1 200 non-null float64 
2 200 non-null float64 
dtypes: float64(2) 
memory usage: 4.7+ KB 
None 

for i, data in data_frame.items(): 
    data.unstack().plot() 

Auf Leistung - wenn Sie aus einem Panel zu starten, Summieren ist schneller als die Gruppierung und Entstapeln. Es ist auch schneller als das Summieren eines einzelnen Datenrahmens.

%timeit panel.sum(axis=1) 
10000 loops, best of 3: 111 µs per loop 

%timeit panel.to_frame().groupby(data_frame.columns, axis=1).apply(lambda x: x.unstack(0).sum(axis=1)) 
100 loops, best of 3: 3.63 ms per loop 

df = data_frame.unstack(0) 
%timeit df.loc[:, '1'].sum(axis=1) 
1000 loops, best of 3: 409 µs per loop 
+0

Wie würden Sie die Anweisung 'for' schreiben, wenn Sie' pd.Panel.to_frame() 'verwendet haben? Gibt es einen Unterschied in der Leistung in der Regel eine Datenstruktur über eine andere, ein "Panel" oder "Glob"? – ShanZhengYang

+0

Siehe Update zur Verwendung von 'to_frame()'. 'glob' analysiert nur die Dateinamen, Sie würden dies auf jeden Fall verwenden. Die Frage ist, ob man die Dateien zuerst zu einem Panel zusammenfasst, um sie dann wieder in Dataframes aufzuteilen oder sie einzeln zu lesen. Letztere wahrscheinlich effizienter. – Stefan

+0

Ich verstehe deinen Standpunkt. Danke – ShanZhengYang

0

Ich würde die Dateien als flache Datei entpacken und den Dateinamen als Spalte hinzufügen. Sie können jetzt einen MultiIndex erstellen, indem Sie den Dateinamen und alle Attribute verwenden, die Sie im Datenrahmen haben.

Die Panels wurden verwendet, bevor die MultiIndex-Funktionalität verbessert wurde. Flat ist besser als verschachtelt.

import glob 
import pandas as pd 

dfs = [] 
for filename in glob.glob('*.txt'): 
    df = pd.read_csv(filename) 
    df['filename'] = filename 
    dfs.append(df) 
dfs = pd.concat(dfs, ignore_index=True) 
Verwandte Themen