Python: Как быстро создать фрейм данных Pandas только с конкретными столбцами из большого листа Excel? - PullRequest
0 голосов
/ 28 октября 2019

У меня есть файл Excel только с одним листом. Размер файла Excel составляет ~ 900 МБ и содержит тысячи строк и сотни столбцов

Я хочу извлечь только несколько столбцов (скажем, Name, Numbers & Address) из Excelлистайте и выполняйте манипуляции с данными.

Поскольку файл Excel огромен, традиционный метод создания фрейма данных с использованием панд и последующего извлечения столбцов занимает много времени.

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

Есть ли более быстрый способ извлечь столбцы из файла Excel?

Ответы [ 4 ]

1 голос
/ 28 октября 2019

Надеюсь, что это поможет

Есть несколько способов попробовать и выбрать лучший подход, который вам подходит.

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_]]

(как вы можете видеть, список слишком длинный, поэтому, если вы укажете 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 ГБ или 6 ГБ.

5. Используйте параметр pandas low_memery.

Используйте (low_memory=False) для явного указания пандам загружать в память файлы большего размера или в случае появления какого-либо предупреждения о памяти.

df = pd.read_csv('sample.csv', low_memory=False)
1 голос
/ 28 октября 2019

Вы можете передать usecols в read_excel, чтобы импортировать только определенные столбцы из Excel в df. Если вы используете панды 0.24+, read_excel может читать непосредственно по значениям столбцов, поэтому просто передайте usecols со списком значений столбцов

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

На пандах <0.24, <code>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]

0 голосов
/ 28 октября 2019

Вы можете посмотреть здесь , потому что панды предоставляют такие специфические методы.

Но более естественным образом это будет работать так:

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 - это генераторная функция, и поэтому она эффективна для памяти.

0 голосов
/ 28 октября 2019

вы можете скопировать интересующие вас столбцы из файла .xlsx в другой .xlsx, а затем выполнить чтение с помощью панд из другого .xlsx

...