pandas – fusionando múltiples DataFrames

Esta es una pregunta de varias partes. Simplemente no puedo combinar todo juntos. El objective es crear un DataFrame (adivinar usando MultiIndex) al que puedo acceder de la siguiente manera:

ticker = 'GOLD' date = pd.to_datetime('1978/03/31') current_bar = df.ix[ticker].ix[date] 

¿Puedo decir: current_bar.Last?

De todos modos, aquí están los archivos, y cómo los cargo.

 In [108]: df = pd.read_csv('GOLD.csv', parse_dates='Date', index_col='Date') In [109]: df Out[109]: Exp Last Volume Date 1978-03-30 198002 995.6 54 1978-03-31 198002 999.5 78 In [110]: df2 = pd.read_csv('SPX.csv', parse_dates='Date', index_col='Date') In [111]: df2 Out[111]: Exp Last Volume Date 1978-03-30 198003 215.5 25 1978-03-31 198003 214.1 99 

Idealmente, quiero que se vea así (creo):

 ticker GOLD SPX values Exp Last Volume Exp Last Volume Date 1978-03-30 198002 995.6 54 198003 215.5 25 1978-03-31 198002 999.5 78 198003 214.1 99 
  1. Supongo que mis preguntas son:
    • ¿Cómo puedo hacer esto jerárquico? (Los datos reales tienen más de 20 columnas idénticas para cada archivo)
    • ¿Cómo luego combino los archivos (tengo alrededor de 100 que necesito para ir todos en 1 DataFrame)?
    • ¿Mi suposición es correcta y puedo hacer: current_bar.Last para obtener los valores?

Muchas gracias.

Puede usar pd.concat para concatenar DataFrames. (La concatenación se mezcla con los DataFrames juntos, mientras que la fusión se une a los DataFrames basados ​​en índices o columnas comunes). Cuando suministra el parámetro de keys , obtiene un índice jerárquico:

 import pandas as pd df = pd.read_csv('GOLD.csv', parse_dates='Date', index_col='Date', sep='\s+') df2 = pd.read_csv('SPX.csv', parse_dates='Date', index_col='Date', sep='\s+') result = pd.concat([df, df2], keys=['GOLD', 'SPX'], names=['ticker']).unstack('ticker') result = result.reorder_levels([1, 0], axis=1).sortlevel(level=0, axis=1) print(result) 

rendimientos

 ticker GOLD SPX Exp Last Volume Exp Last Volume Date 1978-03-30 198002 995.6 54 198003 215.5 25 1978-03-31 198002 999.5 78 198003 214.1 99 

result['Last'] produce el DataFrame:

 In [147]: result['Last'] Out[147]: ticker GOLD SPX Date 1978-03-30 995.6 215.5 1978-03-31 999.5 214.1 

Recomiendo evitar el resultado de la syntax. result.Last porque está demasiado cerca de result.last , que devuelve un método DataFrame.


Para manejar más archivos, puede usar código como este:

 import pandas as pd dfs = list() for filename in filenames: df = pd.read_csv(filename, parse_dates='Date', index_col='Date') # compute moving_mean dfs.append(df) keys = [filename[:-4] for filename in filenames] result = pd.concat(dfs, keys=keys, names=['ticker']).unstack('ticker') 

Tenga en cuenta que esto requiere suficiente memoria para contener una lista de todos los DataFrames en la memoria más suficiente memoria para mantener el result .