2016-01-27 58 views
1

上的文件名字符串我有在他們的CSV文件多個文件夾,和我創建笛卡爾名單和運行上的所有文件組合的一些統計數據。功能從而改變基於列表

到目前爲止,我喜歡這個執行此:

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 

但我的問題是我有多個文件夾,我需要一個途徑中瀏覽到。所以r'F:\Sheyenne\Statistics\IDL_stats\NDVI'只是衆多文件夾我需要在執行此代碼之一。有沒有一種方法來創建一個函數,改變路徑的字符串做到這一點?因此,如果一個文件夾位置是r'F:\Sheyenne\Statistics\IDL_stats\NDII'和我有名字NDVINDII我要自動執行它通過簡單地改變基於通路內的字符串(僅r'F:\Sheyenne\Statistics\IDL_stats\後的部分)上運行的下一個文件夾相同的代碼清單列表中的項目。

我希望是有道理的。

回答

1

創建一個函數:

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) 

,並用它爲您的所有路徑:

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

更好的想法:只是包裝在一個循環的原件。

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

你可以包裝在以下類型的循環代碼:

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正確連接任何數量的部件在一起,形成適合您的操作系統的有效路徑。這將顯示以下的輸出:

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