2017-06-16 1 views
1

Ich habe einen Ordner von CSV-Dateien, die ich transformieren und manipulieren/bereinigen muss und gebe einen Datenrahmen aus, mit dem ich dann weiterarbeiten kann . Ich möchte einen Datenrahmen mit einer eindeutigen Überschrift pro CSV-Datei, die ich habe. Ich habe den Code geschrieben, um nur eine der CSV-Dateien so bearbeiten zu können, wie ich möchte, mit einem sauberen Datenframe am Ende, aber ich stolperte beim Versuch, den Ordner zu durchlaufen und alle zu transformieren Die CSV-Dateien enden mit einem Datenrahmen pro CSV.Umwandeln eines Ordners von CSV-Dateien auf die gleiche Weise, dann Ausgabe mehrerer Datenrahmen mit Python

Hier ist der Code, den ich habe mit gearbeitet:

import pandas as pd 
import numpy as np 
import os 
from os import listdir 
import glob 
import win32com.client 

filepath = 'C:/Users/me/BMI' 

xl = win32com.client.gencache.EnsureDispatch('Excel.Application') 

for f in glob.glob(filepath+'/*.xls'): 
    fullname = os.path.abspath(f) 
    xl.Workbooks.Open(fullname) 
    xl.ActiveWorkbook.SaveAs(Filename=fullname.replace('.xls','.csv'), 
     FileFormat=win32com.client.constants.xlCSVMSDOS, 
     CreateBackup=False) 
    xl.ActiveWorkbook.Close(SaveChanges=False) 

os.listdir('C:/Users/me/BMI') 

def find_csv_filenames(path_to_dir, suffix=".csv"): 
    filenames = listdir(path_to_dir) 
    return [ filename for filename in filenames if filename.endswith(suffix) ] 

filenames = list(find_csv_filenames(filepath)) 

for i in filenaames: 
    df = pd.read_csv(filepath+'/'+i) 
    del df['Unnamed: 0'] 

# Extract by rows - create list of rows that are blank 
nul_rows = list(df[df.isnull().all(axis=1)].index) 

list_of_dataframes = [] 
list_of_dataframes.append(df.iloc[:nul_rows[0] - 1,:]) 
for i in range(len(nul_rows) - 1): 
    list_of_dataframes.append(df.iloc[nul_rows[i]+1:nul_rows[i],:]) 

list_of_dataframes.append(df.iloc[nul_rows[4] - 1::]) 

# Remove null columns 
cleaned_tables = [] 
for _df in list_of_dataframes: 
    cleaned_tables.append(_df.dropna(axis=1, how='all')) 

# cleaned_tables is a list of the dataframes 
print(cleaned_tables[0]) 

# drop second row of data frame (subtitle) 
df = df.drop(df.index[0]) 

#set up headers in row 1 
df=df.set_value(1, df.columns[0], 'brands') 

# change column names to proper headers (brand as first column, years of data following) 
for i in list(range(len(df.columns))): 
    df = df.rename(columns={df.columns[i]: df.iloc[0][df.columns[i]]}) 

#get rid of double headers (row 1) 
df = df.drop(df.index[0]) 
+0

Wenn Sie sagen, dass Sie immer wieder gestolpert sind, erhalten Sie einen Fehler? – ToothlessRebel

+0

Große Frage, sorry, ich habe nicht angegeben, ich meine, dass ich nicht weiß, wie man dieses ganze Skript zu einem macht, das ich csv-Dateien durchschleifen und transformieren kann, anstatt nur eines. Jarad hat in einem anderen Kommentar einen guten Vorschlag dazu gemacht, aber ich stoße jetzt auf Probleme mit dem pd.read_csv-Teil des Skripts. – triciascully

Antwort

1

Wenn Sie Code haben, der eine einzige CSV-transformiert, und Sie wollen die gleichen Aktionen auf allen .csvs in einem Verzeichnis auszuführen, und Ende mit einem einzigartigen DataFrame für jede .csv, könnten Sie so etwas tun?

import pandas as pd 
import numpy as np 
import os 

filepath = r'C:\Users\me\BMI' 

df_list = [] 
for file in os.listdir(): 
    if file.endswith('.csv'): 
    temp_df = pd.read_csv(os.path.join(filepath, file), encoding='utf-8') 
    # transformation and clean-up steps here... 

    # ... 
    df_list.append(temp_df) 

Jeder temp_df würde im df_list gespeichert werden.

Man könnte sich in einen letzten Datenrahmen am Ende wie folgen verketten:

one_df = pd.concat(df_list, ignore_index=True) 

Wenn Sie auf Probleme stoßen, die Datei in den Datenrahmen zu lesen, versuchen, den Separator sep definieren (wenn Ihre Daten nicht ist komma Begrenzt) und encoding, wenn Ihre CSV-Dateien in einer bestimmten Codierung codiert sind. Bsp .:

pd.read_csv(..., sep='\t', encoding='cp1252') 
+0

Danke, Jarad! Ich habe versucht, es so zu formatieren, wie Sie sagten, aber wenn ich (df_list) drucke, bekomme ich []: – triciascully

+0

Ich bekomme einen Fehler auf dem os.listdir (Datei) Teil, und ich dachte, es könnte sein, weil der Dateiname nicht ist der absolute Dateiname, aber das scheint auch nicht das Problem zu sein: 3 df_list = [] ----> 4 für Datei in os.listdir (Datei): 5 if file.endswith ('. csv') : 6 temp_df = pd.read_csv (Dateipfad + '/' + Datei) FileNotFoundError: [WinError 3] Das System kann den angegebenen Pfad nicht finden: 'File_a.csv' – triciascully

+0

Ich habe den obigen Code aktualisiert. Was ist, wenn Sie 'filepath = r'C: \ Users \ me \ BMI'' über alles hinzufügen und 'os.path.join (filepath, file)' in der 'read_csv' Methode verwenden? Sie müssen möglicherweise auch Ihren Code ein wenig ändern. Ihr Code ist nicht gerade ein "reproduzierbares Beispiel". Ich versuche nur, dir Ideen zu geben. – Jarad

Verwandte Themen