![](/img/trans.png)
[英]How do I verify specific Cell Value in an Excel Sheet through Pandas Data Frame in Python3.7
[英]Python: How to quickly create a pandas data frame with only specific columns from a big excel sheet?
我有一個只有一張紙的 excel 文件。 excel 文件的大小約為 900 Mb,包含數千行和數百列
我只想從 excel 表中提取幾列(比如Name
、 Numbers
和Address
)並進行數據操作。
由於 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 單元格值。 您需要知道與Name
、 Numbers
、 Address
或其 integer 位置相對應的Excel column letters
。
例如: Name
在B
處; G
處的Numbers
; Address
在AA
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.