2016-03-20 5 views
1

Ich habe viele Excel-Dateien in einem Verzeichnis mit der gleichen Struktur für jede Datei - zum Beispiel könnten die folgenden Daten sein test1.xlsx:Erstellen Sie ein neues Blatt mit Summen der spezifischen Spalte für jede Datei im Verzeichnis mehrerer xlsx-Dateien

Date  Type  Name  Task  Subtask  Hours 
3/20/16 Type1 Name1  TaskXyz SubtaskXYZ 1.00 
3/20/16 Type1 Name2  TaskXyz SubtaskXYZ 2.00 
3/20/16 Type1 Name3  TaskXyz SubtaskXYZ 1.00 

Was würde ich tun möchte, ist eine neue Excel-Datei mit dem Dateinamen und Summe der einzelnen Dateien in dem Verzeichnis erstellen, die wie folgt aussehen:

File Name  Sum of hours 
Test1.xlsx 4 
test2.xlsx 10 
...   ... 

ich habe gerade angefangen zu spielen, um mit glob, und das war hilfreich für ein großer Datenrahmen wie folgt zu schaffen:

all_data = pd.DataFrame() 
for f in glob.glob("path/*.xlsx"): 
    df = pd.read_excel(f, skiprows=4,index_col=None, na_values=['NA']) 
    all_data = all_data.append(df,ignore_index=True) 

Dies hat eine Datenrahmen aller Daten Agnostiker des Blattes hilfreich kam es aus für die Erstellung und ich in der Lage gewesen groupbys zu verwenden, um die Daten auf der Makroebene zu analysieren, sondern , für alles, was ich weiß, ich kann nicht für Blatt Summe der Datenrahmen setzen in nur Dinge wie:

task_output = all_data.groupby(["Task","Subtask"])["Hours"].agg([np.sum,np.mean]) 

Wo auf der gesamten Datenrahmen ich in der Lage bin zu summieren und eine mittlere vs jedes einzelne Blatt.

Irgendwelche Ideen, wo man damit anfangen soll?

+0

könnten Sie bitte "nicht ideal" definieren? – MaxU

+0

@MaxU Ich habe ein bisschen mehr Kontext hinzugefügt, kurz gesagt, ich konnte eine Summe des Datenrahmens als Ganzes erhalten (alle Excel-Blätter in einem Datenrahmen), aber ich konnte keine Summe davon bekommen Stunden pro Blatt. – tmgolf

+0

Wie möchten Sie Ihre Daten gruppieren - nach Dateiname oder nach '[" Task "," Subtask "]'? Und haben Sie Ihre Daten in mehreren Blättern in Ihrer Excel-Datei oder ist es immer ein Blatt? – MaxU

Antwort

1

Während Sie Datei in den Speicher lesen, sollten Sie Dateinamen remeber Sie gerade bearbeiten:

all_data = pd.DataFrame() 
for f in glob.glob("path/*.xlsx"): 
    df = pd.read_excel(f, skiprows=4,index_col=None, na_values=['NA']) 
    df['filename'] = f 
    all_data = all_data.append(df,ignore_index=True) 

task_output = all_data.groupby(['filename', "Task","Subtask"])["Hours"].agg([np.sum,np.mean]) 
+0

, die viel Sinn macht. Eine Sache, in die ich jetzt renne ist, dass es nur für die letzte Datei im Verzeichnis – tmgolf

+0

zieht ich bin mir nicht sicher, was du meinst. Können Sie erklären ? – biniow

+0

ein Fehler, den ich mit der Formatierung gemacht habe. Das hat funktioniert, danke! – tmgolf

1

Ich würde sammeln Sie alle Ihre Datenrahmen in eine Liste aufgenommen und sie dann in einem Schuss verketten - sollte es viel schneller sein:

import os 
import glob 
import pandas as pd 

def merge_excel_to_df_add_filename(flist, **kwargs): 
    dfs = [] 
    for f in flist:  
     df = pd.read_excel(f, **kwargs) 
     df['file'] = f 
     dfs.append(df) 
    return pd.concat(dfs, ignore_index=True) 

fmask = os.path.join('/path/to/excel/files', '*.xlsx') 
df = merge_excel_to_df_add_filename(glob.glob(fmask), 
            skiprows=4, 
            index_col=None, 
            na_values=['NA']) 
g = df.groupby('file')['Hours'].agg({'Hours': ['sum','mean']}).reset_index() 
# rename columns 
g.columns = ['File_Name', 'sum of hours', 'average hours'] 
# write result to Excel file 
g.to_excel('result.xlsx', index=False) 
+0

Hmm, ich erhalte einen Fehler: raise ValueError ('Wenn du alle Skalarwerte verwendest, musst du' ValueError übergeben: Wenn du alle skalaren Werte verwendest, musst du einen Index – tmgolf

+0

@tmgolf übergeben, überprüfe den Pfad zu deinen Excel Dateien in 'fmask = os.path.join ('/ pfad/zu/excel/files', '* .xlsx') ' – MaxU

+0

ich habe es aktualisiert, um/Users//Desktop/test und sogar mit Ihrem letzten Update erhalten den Fehler. – tmgolf

Verwandte Themen