簡體   English   中英

Python:如何快速創建一個 pandas 數據框,其中只有來自大型 excel 表的特定列?

[英]Python: How to quickly create a pandas data frame with only specific columns from a big excel sheet?

我有一個只有一張紙的 excel 文件。 excel 文件的大小約為 900 Mb,包含數千行和數百列

我只想從 excel 表中提取幾列(比如NameNumbersAddress )並進行數據操作。

由於 excel 文件很大,使用 pandas 創建數據框然后提取列的傳統方法需要大量時間。

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

有沒有更快的方法從 excel 文件中提取列?

您可以將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 < 0.24 上, usecols無法理解 excel 單元格值。 您需要知道與NameNumbersAddress或其 integer 位置相對應的Excel column letters

例如: NameB處; G處的Numbers AddressAA

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

如果您知道他們的 integer 位置,則可以使用它們代替“B”、“G”、“AA”,例如usecols=[1, 6, 26]

希望這可以幫助

您可以嘗試幾種方法並采取最適合您的方法。

1. 在加載數據時指定所需的列。 (就像Andy L.回答)

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

2. 指定數據類型

Pandas,對於每一個數據讀取操作,都會自己完成識別數據類型的繁重工作。 這會消耗 memory 和時間。 此外,這需要一次讀取整個數據。

為了避免它 - 指定你的列數據類型( 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 的替代品)。

在 null 值或為空的情況下,您可以在這里輕松處理。 (免責聲明:我從未嘗試過)

例子

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 將較大的文件加載到 memory 或如果您收到任何 memory 警告。

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

您可以將您感興趣的列從 file.xlsx 復制到 another.xlsx,然后使用 pandas 從 another.xlsx 進行讀取

你可以看這里,因為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 之外的所有內容都是生成器 function,因此 memory 是有效的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM