【发布时间】:2022-08-24 12:36:47
【问题描述】:
我编写了以下函数(可以提高效率)来遍历我的项目目录:\' ../data/test_input\' 使用 os.listdir() 并读取我的数据文件(总共 10 个),数据矩阵的形状范围为 4X4、6X6 , 8X8, ..., 22X22。
下面是excel表格数据的sn-p。相同的表格集适用于 6X6、8X8、...、22X22
我的目标是该函数返回一个 df_4, df_6, df_8, df_10, df_12, df_14, df_16, df_18, df_20, df_22 的元组,我可以循环并执行一些预处理,然后再将它们单独提供给我的模型。
import pandas as pd
import numpy as np
import os
import re
def read_files(file_name, loc_list=None):
if loc_list is None:
loc_list = []
for itm in loc_list:
if itm == 4:
df_4 = pd.read_excel(file_name, sheet_name=\'Sheet1\', skiprows=1, nrows=4, usecols=range(1, 5))
df_4.columns = [k for k in range(1, len(df_4.columns) + 1)]
df_4.index = df_4.index + 1
# loc_list.remove(itm)
elif itm == 6:
df_6 = pd.read_excel(file_name, sheet_name=\'Sheet1\', skiprows=1, nrows=6, usecols=range(1, 7))
df_6.columns = [k for k in range(1, len(df_6.columns) + 1)]
df_6.index = df_6.index + 1
# loc_list.remove(itm)
elif itm == 8:
df_8 = pd.read_excel(file_name, sheet_name=\'Sheet1\', skiprows=1, nrows=8, usecols=range(1, 9))
df_8.columns = [k for k in range(1, len(df_8.columns) + 1)]
df_8.index = df_8.index + 1
elif itm == 10:
df_10 = pd.read_excel(file_name, sheet_name=\'Sheet1\', skiprows=1, nrows=10, usecols=range(1, 11))
df_10.columns = [k for k in range(1, len(df_10.columns) + 1)]
df_10.index = df_10.index + 1
elif itm == 12:
df_12 = pd.read_excel(file_name, sheet_name=\'Sheet1\', skiprows=1, nrows=12, usecols=range(1, 13))
df_12.columns = [k for k in range(1, len(df_12.columns) + 1)]
df_12.index = df_12.index + 1
elif itm == 14:
df_14 = pd.read_excel(file_name, sheet_name=\'Sheet1\', skiprows=1, nrows=14, usecols=range(1, 15))
df_14.columns = [k for k in range(1, len(df_14.columns) + 1)]
df_14.index = df_14.index + 1
elif itm == 16:
df_16 = pd.read_excel(file_name, sheet_name=\'Sheet1\', skiprows=1, nrows=16, usecols=range(1, 17))
df_16.columns = [k for k in range(1, len(df_16.columns) + 1)]
df_16.index = df_16.index + 1
elif itm == 18:
df_18 = pd.read_excel(file_name, sheet_name=\'Sheet1\', skiprows=1, nrows=18, usecols=range(1, 19))
df_18.columns = [k for k in range(1, len(df_18.columns) + 1)]
df_18.index = df_18.index + 1
elif itm == 20:
df_20 = pd.read_excel(file_name, sheet_name=\'Sheet1\', skiprows=1, nrows=20, usecols=range(1, 21))
df_20.columns = [k for k in range(1, len(df_20.columns) + 1)]
df_20.index = df_20.index + 1
elif itm == 22:
df_22 = pd.read_excel(file_name, sheet_name=\'Sheet1\', skiprows=1, nrows=22, usecols=range(1, 23))
df_22.columns = [k for k in range(1, len(df_22.columns) + 1)]
df_22.index = df_22.index + 1
return df_4, df_6, df_8, df_10, df_12, df_14, df_16, df_18, df_20, df_22
breaking_point = 0
loca_list = []
[loca_list.append(int(z)) for fname in os.listdir(\'../data/test_input\') for z in re.findall(\'[0-9]+\', fname)]
loca_list = sorted(loca_list)
breaking_point = 0
# TODO - perhaps consider mass read of data from excel in the dir/listdir
for fname in os.listdir(\'../data/test_input\'):
if fname.endswith(\'.xlsx\') and re.findall(\'[0-9]+\', fname) and \'ex\' in fname:
df_tuple = read_files(\'../data/test_input/\' + fname, loc_list=loca_list) # TODO
breaking_point = 1
# print the shape of df_tuple to inspect
for tuP in df_tuple:
print(tuP.shape)
breaking_point = 2
for tuP in df_tuple:
print(\'------------------ \\n\')
print(tuP)
我的预期输出是为上面列出的每个返回值提供一个 pandas df。相反,我得到了以下结果,这不是我想要的。
(4, 4)
(6, 6)
(8, 8)
(8, 8)
(8, 8)
(8, 8)
(8, 8)
(8, 8)
(8, 8)
(8, 8)
------------------ below is correct as expected:
1 2 3 4
1 9999 1606 1410 330
2 1096 9999 531 567
3 485 2322 9999 1236
4 960 496 700 9999
------------------ also correct as expected:
1 2 3 4 5 6
1 9999 1606 1410 330 42 539
2 1096 9999 531 567 1359 29
3 485 2322 9999 1236 28 290
4 960 496 700 9999 650 904
5 626 780 1367 696 9999 220
6 631 1218 1486 1163 24 9999
------------------ correct as expected:
1 2 3 4 5 6 7 8
1 9999 1606 1410 330 42 539 626 652
2 1096 9999 531 567 1359 29 846 481
3 485 2322 9999 1236 28 290 742 180
4 960 496 700 9999 650 904 416 1149
5 626 780 1367 696 9999 220 329 828
6 631 1218 1486 1163 24 9999 416 1057
7 657 460 819 733 761 1265 9999 463
8 1102 376 566 1324 409 1168 743 9999
------------------ below is from wrong:
1 2 3 4 5 6 7 8
1 9999 1606 1410 330 42 539 626 652
2 1096 9999 531 567 1359 29 846 481
3 485 2322 9999 1236 28 290 742 180
4 960 496 700 9999 650 904 416 1149
5 626 780 1367 696 9999 220 329 828
6 631 1218 1486 1163 24 9999 416 1057
7 657 460 819 733 761 1265 9999 463
8 1102 376 566 1324 409 1168 743 9999
------------------ below is from wrong; expected 10 X 10:
1 2 3 4 5 6 7 8
1 9999 1606 1410 330 42 539 626 652
2 1096 9999 531 567 1359 29 846 481
3 485 2322 9999 1236 28 290 742 180
4 960 496 700 9999 650 904 416 1149
5 626 780 1367 696 9999 220 329 828
6 631 1218 1486 1163 24 9999 416 1057
7 657 460 819 733 761 1265 9999 463
8 1102 376 566 1324 409 1168 743 9999
------------------ below is from wrong; expected 12 X 12:
1 2 3 4 5 6 7 8
1 9999 1606 1410 330 42 539 626 652
2 1096 9999 531 567 1359 29 846 481
3 485 2322 9999 1236 28 290 742 180
4 960 496 700 9999 650 904 416 1149
5 626 780 1367 696 9999 220 329 828
6 631 1218 1486 1163 24 9999 416 1057
7 657 460 819 733 761 1265 9999 463
8 1102 376 566 1324 409 1168 743 9999
------------------ below is from wrong; expected 14 X14:
1 2 3 4 5 6 7 8
1 9999 1606 1410 330 42 539 626 652
2 1096 9999 531 567 1359 29 846 481
3 485 2322 9999 1236 28 290 742 180
4 960 496 700 9999 650 904 416 1149
5 626 780 1367 696 9999 220 329 828
6 631 1218 1486 1163 24 9999 416 1057
7 657 460 819 733 761 1265 9999 463
8 1102 376 566 1324 409 1168 743 9999
------------------ below is from wrong; expected 16 X16:
1 2 3 4 5 6 7 8
1 9999 1606 1410 330 42 539 626 652
2 1096 9999 531 567 1359 29 846 481
3 485 2322 9999 1236 28 290 742 180
4 960 496 700 9999 650 904 416 1149
5 626 780 1367 696 9999 220 329 828
6 631 1218 1486 1163 24 9999 416 1057
7 657 460 819 733 761 1265 9999 463
8 1102 376 566 1324 409 1168 743 9999
------------------ below is from wrong; expected 18 X 18:
1 2 3 4 5 6 7 8
1 9999 1606 1410 330 42 539 626 652
2 1096 9999 531 567 1359 29 846 481
3 485 2322 9999 1236 28 290 742 180
4 960 496 700 9999 650 904 416 1149
5 626 780 1367 696 9999 220 329 828
6 631 1218 1486 1163 24 9999 416 1057
7 657 460 819 733 761 1265 9999 463
8 1102 376 566 1324 409 1168 743 9999
------------------ below is from wrong; expected 20 X 20:
1 2 3 4 5 6 7 8
1 9999 1606 1410 330 42 539 626 652
2 1096 9999 531 567 1359 29 846 481
3 485 2322 9999 1236 28 290 742 180
4 960 496 700 9999 650 904 416 1149
5 626 780 1367 696 9999 220 329 828
6 631 1218 1486 1163 24 9999 416 1057
7 657 460 819 733 761 1265 9999 463
8 1102 376 566 1324 409 1168 743 9999
------------------ below is from wrong; expected 22 X 22:
1 2 3 4 5 6 7 8
1 9999 1606 1410 330 42 539 626 652
2 1096 9999 531 567 1359 29 846 481
3 485 2322 9999 1236 28 290 742 180
4 960 496 700 9999 650 904 416 1149
5 626 780 1367 696 9999 220 329 828
6 631 1218 1486 1163 24 9999 416 1057
7 657 460 819 733 761 1265 9999 463
8 1102 376 566 1324 409 1168 743 9999
Also, I am getting the following panda \"FutureWarning\" message:
FutureWarning:不推荐使用超出范围的索引定义 usecols,并将在未来版本中引发 ParserError。 df_12 = pd.read_excel(file_name, sheet_name=\'Sheet1\', skiprows=1, nrows=12, usecols=range(1, 13))
FutureWarning:不推荐使用超出范围的索引定义 usecols,并将在未来版本中引发 ParserError。 df_14 = pd.read_excel(file_name, sheet_name=\'Sheet1\', skiprows=1, nrows=14, usecols=range(1, 15))
...
FutureWarning:不推荐使用超出范围的索引定义 usecols,并将在未来版本中引发 ParserError。 df_22 = pd.read_excel(file_name, sheet_name=\'Sheet1\', skiprows=1, nrows=22, usecols=range(1, 23))
我也多次在线查找此“FutureWarming”,但没有找到解决我问题的正确方法。
如果有人可以帮助向我指出我的错误,我会很高兴,因为我已经花了很多时间跟踪错误但无济于事。
-
我的第一个任务是确保您正在发现您期望的文件并且它们包含预期的数据。警告看起来好像您正在从应该是 10x10 的文件中传递 8x8 数据集。即,它试图在 excel 中使用 8x8 矩阵读取 10x10。
-
@AndyMitchell 我已经检查了所有这些,一切看起来都很好。但问题仍然存在。
-
它看起来好像仍然坚持在 \'elif itm==8\' 上。将打印语句放入,例如 \'elif itm==10\'。如果 print 语句被触发,问题将出在它调用的数据上,因为 read_excel 调用看起来没问题。您是否也尝试过在没有附加逻辑的情况下手动调用不正确的数据帧之一?
-
@AndyMitchell 是的,我试过了。打印语句被触发。但是为什么问题出在被调用的数据上呢?它与 4 X 4、6 X 6、...、n X n 数据矩阵具有相同的格式和形状。
-
@AndyMitchell 你是对的,它卡在了 elif==8 级别。目前我不确定是什么原因导致 10 x 10 及更高的矩阵在函数调用期间无法按预期读取。