2016-11-22 7 views
1

Ich lese in mehreren großen (~ 700mb) CSV-Dateien in einen Datenrahmen zu konvertieren, die alle in einer einzigen CSV kombiniert werden. Im Moment ist jeder CSV Index durch die date Spalte in jedem CSV. Alle CSVs haben überlappende Daten, verfügen jedoch über eindeutige Testorte. Jede CSV wird nach ihrem Testort benannt (z. B. ber.csv und alt.csv für BER- und ALT-Teststandorte). Wie kann ich so multi-indexieren? Im Moment habe ich:Add Spalte zu Pandas Datenrahmen für Multi-Index

def openFile(filesToProcess): 
    df1 = pd.DataFrame() 
    counter = 0 
    for input in filesToProcess: 
     base = os.path.splitext(basename(input))[0] 
     print "Working on %s" % base 
     with open(input, 'r') as input_file: 
      #row_count = sum(1 for row in input_file) 
      if counter == 0: 
       df1 = createDataFrame(input_file) 
      else: 
       df2 = createDataFrame(input_file) 
       df1 = pd.concat([df1,df2]) 
     counter += 1 
     input_file.close() 
    df1.to_csv('large.csv') 

def createDataFrame(input_file): 
    checkTime = time.clock() 
    #print "Start DataFrame -- #%d" % counter 
    df1 = pd.read_csv(input_file, 
      sep = ",", 
      nrows = 500, 
      index_col = ['Date']) 
    #print "End DataFrame -- #%d" % counter 
    #print "Ran for " + str(time.clock() - checkTime) + " Seconds" 
    return df1 

So zum Beispiel ich

date, testsite, data1, data2 
1/1/1992 9:15:00, ber, 89, 200 
1/1/1992 9:17:00, ber, 54, 103.3 
1/1/1992 9:15:00, alt, 90, 109.23 
1/1/1992 9:17:00, alt, 12, 110.1 

möchten, wo date und testsite sind die Multi-Index

Antwort

0

Setup

ber_df = pd.DataFrame([[89, 200], [54, 103.3]], 
         pd.DatetimeIndex(['1/1/1992 9:15:00', '1/1/1992 9:17:00'], 
             name='date'), 
         ['data1', 'data2']) 


alt_df = pd.DataFrame([[90, 109.23], [12, 110.1]], 
         pd.DatetimeIndex(['1/1/1992 9:15:00', '1/1/1992 9:17:00'], 
             name='date'), 
         ['data1', 'data2']) 


ber_df.to_csv('ber.csv') 

alt_df.to_csv('alt.csv') 

Lösung

filesToProcess = ['ber.csv', 'alt.csv'] 

def parse_file(fn): 
    return pd.read_csv(fn, index_col=0, parse_dates=[0]) 

pd.concat({fn.replace('.csv', ''): parse_file(fn) for fn in filesToProcess}) \ 
    .rename_axis(['testsite', 'date'], axis=0).swaplevel(0, 1).reset_index() 

enter image description here

Verwandte Themen