2016-01-27 2 views
1

J'ai plusieurs dossiers avec des fichiers CSV, et je crée des listes cartésiennes et des statistiques sur toutes les combinaisons de fichiers.Fonction qui modifie les chaînes de noms de fichiers en fonction d'une liste

Jusqu'à présent, je suis l'exécution de ce comme ceci:

import pandas as pd 
import os 
import scipy as sp 
from scipy import stats 
import glob 
import itertools 
# 
# 
path =r'F:\Sheyenne\Statistics\IDL_stats\NDVI' # use your path 
allfiles = glob.glob(path + "/*.csv") 
result = list(itertools.product(allfiles,allfiles)) 
# 
dataframe=[] 
for files in result: 
    x=(pd.read_csv(files[0], names = ['Percent', 'Value'])) 
    z=x.Percent 
    y=(pd.read_csv(files[1], names = ['Percent', 'Value'])) 
    d=y.Percent 
    stats2=sp.stats.ks_2samp(z,d) 
    g=files, stats2 
    df=pd.DataFrame(data=list(sum(g,())), index=['File1', 'File2', 'D', 'p_value']).transpose() 
    dataframe.append(df) 
df=pd.concat(dataframe) 
print df 

mais mon problème est que j'ai plusieurs dossiers dont j'ai besoin de naviguer à l'intérieur d'une voie. Donc, r'F:\Sheyenne\Statistics\IDL_stats\NDVI' est juste un des nombreux dossiers dont j'ai besoin pour exécuter ce code. Y a-t-il un moyen de créer une fonction et de changer la chaîne du chemin pour le faire? Donc, si l'emplacement du dossier suivant est r'F:\Sheyenne\Statistics\IDL_stats\NDII' et que j'ai une liste avec les noms NDVI et NDII Je veux l'automatiser pour exécuter le même code sur le dossier suivant en changeant simplement la chaîne (seulement la partie après r'F:\Sheyenne\Statistics\IDL_stats\) dans le chemin basé sur les éléments de la liste.

J'espère que cela a du sens.

Répondre

1

Créer une fonction:

def get_df(path): 
    allfiles = glob.glob(path + "/*.csv") 
    result = list(itertools.product(allfiles,allfiles)) 
    # 
    dataframe=[] 
    for files in result: 
     x=(pd.read_csv(files[0], names = ['Percent', 'Value'])) 
     z=x.Percent 
     y=(pd.read_csv(files[1], names = ['Percent', 'Value'])) 
     d=y.Percent 
     stats2=sp.stats.ks_2samp(z,d) 
     g=files, stats2 
     df=pd.DataFrame(data=list(sum(g,())), index=['File1', 'File2', 'D', 'p_value']).transpose() 
     dataframe.append(df) 
    return pd.concat(dataframe) 

et l'utiliser pour tous vos chemins:

import os 

paths = [os.path.join(r'F:\Sheyenne\Statistics\IDL_stats', name) 
     for name in ['NDVI', 'NDII']] 
dfs = [get_df(path) for path in paths] 
0

meilleure idée: il suffit envelopper l'original dans une boucle.

for folder in ('NDVI', 'NDII'): 
    path =r'F:\Sheyenne\Statistics\IDL_stats\' + folder 
    ... 
0

Vous pouvez envelopper votre code dans le genre de boucle suivante:

import os 

root_path = r'F:\Sheyenne\Statistics\IDL_stats' 
folders = ['NDVI', 'NDII'] 

for folder in folders: 
    path = os.path.join(root_path, folder, '*.csv') 
    print path 
    allfiles = glob.glob(path) 

os.path.join correctement rejoint un certain nombre de pièces pour former un chemin valide approprié pour votre système d'exploitation. Ceci afficherait la sortie suivante:

F:\Sheyenne\Statistics\IDL_stats\NDVI\*.csv 
F:\Sheyenne\Statistics\IDL_stats\NDII\*.csv