2016-07-30 5 views
1

I .csv Dateien in mehreren Ordnern haben, die wie folgt aussehen:Merge jeder Datenrahmen in einem Ordner

File1

Count 2002_Crop_1 2002_Crop_2 Ecoregion 
20  Corn   Soy   46 
15  Barley  Oats   46 

Datei 2

Count 2003_Crop_1 2003_Crop_2 Ecoregion 
24  Corn   Soy   46 
18  Barley   Oats   46 

für jeden Ordner Ich möchte alle fusionieren der Dateien innerhalb.

Meine gewünschte Ausgabe wird in etwa so aussehen:

Crop_1 Crop_2 2002_Count 2003_Count Ecoregion 
Corn Soy 20   24   46 
Barley Oats 15   18   46 

In Wirklichkeit gibt es 10 Dateien in jedem Ordner, nicht nur 2, das muss zusammengeführt werden.

Ich verwende diesen Code ab sofort:

import pandas as pd, os 
#pathway to all the folders 
folders=r'G:\Stefano\CDL_Trajectory\combined_eco_folders' 
for folder in os.listdir(folders): 
    for f in os.listdir(os.path.join(folders,folder)): 
      dfs=pd.read_csv(os.path.join(folders,folder,f)) #turn each file from each folder into a dataframe 
      df = reduce(lambda left,right: pd.merge(left,right,on=[dfs[dfs.columns[1]], dfs[dfs.columns[2]]],how='outer'),dfs) #merge all the dataframes based on column location 

aber zurück: TypeError: string indices must be integers, not Series

Antwort

2
  • Verwenden glob.glob zu traverse a directory at a fixed depth.

  • Versuchen Sie, pd.merge wiederholt zu vermeiden, wenn Sie es helfen können. Jeder Aufruf an pd.merge erstellt einen neuen DataFrame. Daher müssen alle Daten in jedem Zwischenergebnis in den neuen DataFrame kopiert werden. Dies in einer Schleife führt zu quadratic copying, was für die Leistung schlecht ist.

  • Wenn Sie das tun einige Spaltennamen ändern Gerangel, zum Beispiel,

    ['Count', '2002_Crop_1', '2002_Crop_2', 'Ecoregion'] 
    

    zu

    ['2002_Count', 'Crop_1', 'Crop_2', 'Ecoregion'] 
    

    dann können Sie ['Crop_1', 'Crop_2', 'Ecoregion'] als Index für jeden Datenrahmen verwenden und vereinen alle Datenrahmen mit einem Anruf zu pd.concat.


import pandas as pd 
import glob 

folders=r'G:\Stefano\CDL_Trajectory\combined_eco_folders' 
dfs = [] 

for filename in glob.glob(os.path.join(folders, *['*']*2)): 
    df = pd.read_csv(filename, sep='\s+') 
    columns = [col.split('_', 1) for col in df.columns] 

    prefix = next(col[0] for col in columns if len(col) > 1) 
    columns = [col[1] if len(col) > 1 else col[0] for col in columns] 
    df.columns = columns 

    df = df.set_index([col for col in df.columns if col != 'Count']) 
    df = df.rename(columns={'Count':'{}_Count'.format(prefix)}) 

    dfs.append(df) 

result = pd.concat(dfs, axis=1) 
result = result.sortlevel(axis=1) 
result = result.reset_index() 
print(result) 

Ausbeuten

Crop_1 Crop_2 Ecoregion 2002_Count 2003_Count 
0 Corn Soy   46   20   24 
1 Barley Oats   46   15   18