【问题标题】:Function which changes strings of filenames based on a list根据列表更改文件名字符串的函数
【发布时间】:2016-01-28 01:18:42
【问题描述】:

我有多个包含 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 的列表,我想通过简单地更改字符串来自动化它以在下一个文件夹上运行相同的代码(仅在 @ 之后的部分987654326@) 基于列表中的项目的路径内。

我希望这是有道理的。

【问题讨论】:

    标签: python csv pandas


    【解决方案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]
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        您可以将代码包装在以下类型的循环中:

        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
        

        【讨论】:

          猜你喜欢
          • 2023-04-05
          • 2021-12-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-14
          相关资源
          最近更新 更多