如何避免 Python 代码中的重复?

3
我有来自一台设备(树轮仪)安装在9棵不同树木上的数据,变量包括:日期和时间、增长率和温度。我每个月去一次实地,下载更多数据。现在我已经完成了3次野外调查,因此我将文件命名为"den11,den12,den13...",其中第一个数字与树木(编号1)有关,第二个数字与调查(1,2,3)有关。
在连接它们之前,我有几个例程需要运行,以便最终只得到9个文件(dendrom1、dendrom2、dendrom3...),以便进行一些绘图和分析。但是到目前为止,我在我的代码中做了很多复制和粘贴,这需要一段时间,很无聊,看起来也很糟糕。我尝试过for循环,但我是一个Python新手,自学中,这部分我还没掌握。
例如,要读取每个Excel文件,我必须执行以下操作:
#Tree1
den11= pd.read_excel('den11.xlsx') 
den12= pd.read_excel('den12.xlsx') 
den13= pd.read_excel('den13.xlsx')

#Tree2
den21= pd.read_excel('den21.xlsx')
den22= pd.read_excel('den22.xlsx') 
den23= pd.read_excel('den23.xlsx')
...
#Tree9

然后,为了避免针对每个九棵树都重复三次,我尝试重新创建每个文件名并将其分配给“f”:

trips = [1,2,3]
trees = range(1,10)
for tree in trees:
    for trip in trips:
         f = 'den' + str(tree) + str(trip)
         print(f)

然后我可以读取每个变量并将它们的名称分配为新变量,但我显然不擅长这个,我在这里缺少一些东西:

os.chdir('...\Plantation\Dendrometers')
basepath = '...\Plantation\Dendrometers'
dlist = os.scandir(basepath)
for dendrometer in dlist:
    f = pd.read_excel(dendrometer)

我使用了'os.scandir'而不是'os.listdir',因为我看到说'scandir'可以进行迭代,我认为这可能会是一个问题。

但它没有起作用,然后我尝试将所有文件名分配给一个列表:

flist = ['den11','den12','den13','den21','den22','den23','den31',
    'den32','den33','den41','den42','den43','den51','den52',
    'den53','den61','den62','den63','den71','den72','den73',
    'den81','den82','den83','den91','den92','den93']

可能是我不能使用元组执行函数,这也不起作用。

如何避免为每个文件重复基本例程并为即将到来的下一个数据做好准备?这是我的所作所为,感觉很糟糕:

new_columns = ['date','increment','temp']
den11.columns = new_columns
den12.columns = new_columns
den13.columns = new_columns
den21.columns = new_columns
...

den11.set_index('date', inplace=True)
den12.set_index('date', inplace=True)
...

den11 = den11.loc['2019-02-14':]
den12 = den12.loc['2019-02-14':]
...

dendrom1 = pd.concat([den11,den12,den13])
...

dendrom1 = dendrom1.loc[~dendrom1.index.duplicated(keep='first')]
...dendrom9 = dendrom9.loc[~dendrom9.index.duplicated(keep='first')]

如果我只需要添加一个旅行,加载具有新文件名的文件夹并运行代码来生成每个树的合并文件“dendrom”,那将是令人惊奇的。

好的观察,它看起来很糟糕。更糟糕的是维护和扩展它 :) - ChiefTwoPencils
1个回答

3

尝试使用os.listdir

d = {}
for i in os.listdir():
    if '.xlsx' in i:
        df = pd.read_excel(i)
        # do all your operations here that you do for every dataframe
        ...
        d[i] = df

要提取特定的数据框,可以使用以下方法:

print(d[excel file name])

然后它将输出您想要的数据框。


谢谢 @U10-Forward!它对大多数操作都有效... 现在我正在尝试做另一个循环,将来自同一树的文件连接起来,例如: dendrom1 = pd.concat([d['den11.xlsx'],d['den12.xlsx'],d['den13.xlsx']]) 我想这个只需要重复(9次)。 - Beto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接