根据列表更改文件名字符串的功能

时间:2016-01-27 17:09:54

标签: python csv pandas

我有多个带有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\之后的部分)基于列表中的项目。

我希望这是有道理的。

3 个答案:

答案 0 :(得分: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]

答案 1 :(得分:0)

更好的主意:只需将原件包裹在一个循环中。

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

答案 2 :(得分: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