【问题标题】:Python: How to quickly create a pandas data frame with only specific columns from a big excel sheet?Python:如何快速创建仅包含大型 Excel 工作表中特定列的 pandas 数据框?
【发布时间】:2020-02-23 10:21:13
【问题描述】:

我有一个只有一张纸的 excel 文件。 excel 文件的大小约为 900 Mb,包含数千行和数百列

我只想从 Excel 工作表中提取几列(比如NameNumbersAddress)并进行数据操作。

由于 excel 文件很大,使用 pandas 创建数据框然后提取列的传统方法需要大量时间。

ExcelFile = pd.read_excel(fileAddress, sheet_name="Sheet1")

有没有更快的方法从 excel 文件中提取列?

【问题讨论】:

    标签: python excel pandas large-data


    【解决方案1】:

    您可以将您感兴趣的列从 file.xlsx 复制到 another.xlsx,然后使用来自 another.xlsx 的 pandas 进行读取

    【讨论】:

    • 对多个 Excel 文件进行大规模处理是不可行的
    【解决方案2】:

    你可以查一下here,因为pandas提供了这样的具体方法。

    但更自然地它会这样工作:

    import csv
    import toolz.curried as tc
    import pandas as pd
    
    def stream_csv(file_path):
        with open(file_path) as f:
            yield from csv.DictReader(f, delimiter='\t')  # you can use any delimiter
    
    file_path = '../../data.csv'
    relevant_data = map(tc.keyfilter(lambda column_name: column_name in ['a', 'b']),
                                    stream_csv(file_path))
    
    pd.DataFrame(relevant_data)
    

    请注意,除了 pandas 之外的所有内容都是生成器函数,因此内存效率很高。

    【讨论】:

      【解决方案3】:

      您可以将usecols 传递给read_excel 以仅将特定列从excel 导入到df。如果您使用 pandas 0.24+,read_excel 能够直接读取列值,因此只需将 usecols 与列值列表一起传递

      df = pd.read_excel(fileAddress, header=0, sheet_name='Sheet1', 
                                      usecols=['Name', 'Numbers', 'Address'])
      

      在 pandas usecols 不理解 excel 单元格值。你需要知道Excel column letters对应NameNumbersAddress或者它们的整数位置。

      例如:Name 位于BNumbersGAddressAA

      df = pd.read_excel(fileAddress, header=0, sheet_name='Sheet1', usecols='B,G,AA')
      

      如果你知道它们的整数位置,你可以用它们代替'B'、'G'、'AA',例如usecols=[1, 6, 26]

      【讨论】:

        【解决方案4】:

        希望对你有帮助

        您可以尝试几种方法并采取最适合您的方法。

        1.在加载数据时指定所需的列。(就像Andy L. 回答)

        df = pd.read_excel(fileAddress, header=0, sheet_name='Sheet1', 
                                        usecols=['Name', 'Numbers', 'Address'])
        

        2。指定数据类型

        对于每个数据读取操作,Pandas 都会自己完成识别数据类型的繁重工作。这会消耗内存和时间。此外,这需要一次读取整个数据。

        为了避免它 - 指定你的列数据类型(dtype)

        例子:

        pd.read_csv('sample.csv', dtype={"user_id": int, "username": object})
        

        pandas 中可用的数据类型

        [numpy.generic,
         [[numpy.number,
           [[numpy.integer,
             [[numpy.signedinteger,
               [numpy.int8,
                numpy.int16,
                numpy.int32,
                numpy.int64,
                numpy.int64,
                numpy.timedelta64]],
              [numpy.unsignedinteger,
               [numpy.uint8,
                numpy.uint16,
                numpy.uint32,
                numpy.uint64,
                numpy.uint64]]]],
            [numpy.inexact,
             [[numpy.floating,
               [numpy.float16, numpy.float32, numpy.float64, numpy.float128]],
              [numpy.complexfloating,
               [numpy.complex64, numpy.complex128, numpy.complex256]]]]]],
          [numpy.flexible,
           [[numpy.character, [numpy.bytes_, numpy.str_]],
            [numpy.void, [numpy.record]]]],
          numpy.bool_,
          numpy.datetime64,
          numpy.object_]]
        

        (如您所见,列表太长,因此如果您指定 dtypes 会加快您的工作速度)

        3.如果您在数据中的数据转换方面需要帮助,您可以使用转换器。

        (几乎像 2,2 的替代)。

        在空值或空值等情况下,您可以在这里轻松处理。 (免责声明:我从未尝试过)

        例子

        def conv(val):
            if not val:
                return 0    
            try:
                return np.float64(val)
            except:        
                return np.float64(0)
        
        df = pd.read_csv('sample.csv', converters={'COL_A':conv,'COL_B':conv})
        

        4.分块读取数据总是有帮助的。

        chunksize = 10 ** 6
        for chunk in pd.read_csv('sample.csv', chunksize=chunksize):
            process(chunk)
        

        需要注意的一点是将每个chunk 视为一个单独的数据框。也有助于读取更大的文件,例如 4 GB 或 6 GB。

        5.使用 pandas low_memery 选项。

        使用 (low_memory=False) 明确告诉 pandas 将较大的文件加载到内存中,或者在您收到任何内存警告的情况下。

        df = pd.read_csv('sample.csv', low_memory=False)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-09-15
          • 2018-12-20
          • 2014-03-25
          • 2018-12-25
          • 2021-11-28
          • 2021-12-05
          • 1970-01-01
          相关资源
          最近更新 更多