Python:如何快速创建一个仅包含大 excel sheet 中特定列的 pandas 数据框?
Python: How to quickly create a pandas data frame with only specific columns from a big excel sheet?
我有一个 excel 文件,其中只有一个 sheet。 excel 文件的大小约为 900 Mb,包含数千行和数百列
我只想从 excel sheet 中提取几列(比如 Name
、Numbers
和 Address
)并进行数据操作。
由于 excel 文件很大,使用 pandas 创建数据框然后提取列的传统方法需要很多时间。
ExcelFile = pd.read_excel(fileAddress, sheet_name="Sheet1")
是否有更快的方法从 excel 文件中提取列?
您可以将您感兴趣的列从 file.xlsx 复制到 another.xlsx,然后使用 pandas 从 another.xlsx
进行阅读
你可以查阅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 之外的所有内容都是生成器函数,因此内存效率高。
您可以将 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 单元格值。你需要知道 Excel column letters
对应 Name
, Numbers
, Address
或它们的整数位置。
例如:Name
在B
; Numbers
在 G
; Address
在 AA
df = pd.read_excel(fileAddress, header=0, sheet_name='Sheet1', usecols='B,G,AA')
如果您知道它们的整数位置,您可以使用它们代替 '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。指定 dtypes
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_]]
(如您所见,列表太长,所以如果您指定数据类型,它会加快您的工作速度)
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)
我有一个 excel 文件,其中只有一个 sheet。 excel 文件的大小约为 900 Mb,包含数千行和数百列
我只想从 excel sheet 中提取几列(比如 Name
、Numbers
和 Address
)并进行数据操作。
由于 excel 文件很大,使用 pandas 创建数据框然后提取列的传统方法需要很多时间。
ExcelFile = pd.read_excel(fileAddress, sheet_name="Sheet1")
是否有更快的方法从 excel 文件中提取列?
您可以将您感兴趣的列从 file.xlsx 复制到 another.xlsx,然后使用 pandas 从 another.xlsx
进行阅读你可以查阅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 之外的所有内容都是生成器函数,因此内存效率高。
您可以将 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 单元格值。你需要知道 Excel column letters
对应 Name
, Numbers
, Address
或它们的整数位置。
例如:Name
在B
; Numbers
在 G
; Address
在 AA
df = pd.read_excel(fileAddress, header=0, sheet_name='Sheet1', usecols='B,G,AA')
如果您知道它们的整数位置,您可以使用它们代替 '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。指定 dtypes
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_]]
(如您所见,列表太长,所以如果您指定数据类型,它会加快您的工作速度)
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)