【问题标题】:pandas excel data read with incorrect output -no getting all the tabular data from excel plus pandas "FutureWarning" Error from "usecols" parameterpandas excel 数据读取时输出不正确 - 没有从 excel 中获取所有表格数据以及 pandas \"FutureWarning\" 来自 \"usecols\" 参数的错误
【发布时间】: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 及更高的矩阵在函数调用期间无法按预期读取。

标签: python pandas


【解决方案1】:
import pandas as pd
import os
import re


def create_tuple_list(fpath):
    tuple_list = [(fname, int(z)) for fname in os.listdir(fpath) for z in re.findall('[0-9]+', fname) if
                  fname.endswith('.xlsx') and 'ex' in fname and re.findall('[0-9]+', fname)]

    return tuple_list


def main():
    # define file path
    dirpath = '../data/test/'

    # function call
    dtup_list = create_tuple_list(dirpath)

    for tuP in dtup_list:
        fname = tuP[0]
        nbr = tuP[1]

        df_c = pd.read_excel(dirpath + fname, sheet_name='Sheet1', skiprows=1, usecols=range(nbr + 1))
        df_c.index = df_c.index + 1


if __name__ == '__main__':
    main()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2021-04-11
    • 1970-01-01
    相关资源
    最近更新 更多