Игнорировать отсутствующие столбцы в pandas read_excel usecols

Есть ли способ заставить панд игнорировать отсутствующие столбцы в usecols при чтении Excel?

Я знаю, что здесь есть похожее решение для read_csv

Но не могу найти решение для Excel.

Например:

# contents of sample.xlsx:
#Col1,Col2,Col3
#1,2,3
#4,5,6

Я хотел бы вернуть следующее, используя pandas.read_excel и его подмножество, но это вызывает ошибку:

pd.read_excel(sample.xlsx, usecols=“A:D”)

ParserError: Defining usecols without of bounds indices is not allowed. [3]

Я думаю, что решение состоит в том, чтобы использовать вызываемый объект, но не знаю, как его реализовать.

это может не вызвать такой проблемы, но будьте осторожны, ваши кавычки являются «умными кавычками» “"

ti7 30.06.2024 23:38

@ ti7 Я бы хотел, но не повезло. Одинарные кавычки не имеют значения

Jack 01.07.2024 00:03
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
69
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ага. Вы можете использовать вызываемую функцию с параметром usecols в pandas.read_excel. Его можно использовать для фильтрации столбцов на основе доступных столбцов в файле Excel.

import pandas as pd

def filter_usecols(cols):
    desired_cols = {'A', 'B', 'C', 'D'}
    return [col for col in cols if col in desired_cols]

# Read the Excel file using the callable for usecols
df = pd.read_excel('sample.xlsx', usecols=filter_usecols)
print(df)

Я попробовал это, но это не работает с такими диапазонами, как «A:AY».

Jack 30.06.2024 23:51

Возможно, вам придется создать собственный список, содержащий A, B, ...AY для желаний_столбцов.

Prajwal 01.07.2024 00:06

Черт возьми, даже если вы преобразуете диапазон Excel в список, это не сработает, поскольку pandas передает в функцию usecols заголовки столбцов, а не индекс. Отредактировал свой вопрос выше.

Jack 01.07.2024 00:28
Ответ принят как подходящий

Сначала создайте специальную функцию для заголовка iloc панд:

def ex_to_iloc(head):
    iloc = 0
    for char in head:
        iloc = iloc * 26 + (ord(char.upper()) - ord('A') + 1)
    return iloc - 1

используйте ex_to_iloc в параметре usecols

import pandas as pd
import io
# string example
csv = '''Col1,Col2,Col3,Col4,Col5
1,2,3,4,5
4,5,6,5,6
'''
# make string to csv file
file = io.StringIO(csv)

# file to dataframe with only 2 rows to check column length
ncol = len(pd.read_csv(file, nrows=2).columns)

# take 'B'(Col2) to 'D'(Col4) 
file = io.StringIO(csv)
df = pd.read_csv(file, usecols=range(ex_to_iloc('B'), min(ex_to_iloc('D') + 1, ncol)))
print('B to D\n',df, '\n')

# take 'B'(Col2) to 'AY'(not exis) 
file = io.StringIO(csv)
df = pd.read_csv(file, usecols=range(ex_to_iloc('B'), min(ex_to_iloc('AY') + 1, ncol)))
print('B to AY\n',df)

вне:

B to D
    Col2  Col3  Col4
0     2     3     4
1     5     6     5 

B to AY
    Col2  Col3  Col4  Col5
0     2     3     4     5
1     5     6     5     6

io, чтобы создать csv-файл с помощью io.StringIO и использовать read_csv, чтобы показать, как работает код в примере. Поскольку вы будете использовать файл Excel, используйте функцию read_excel.

Замена вышеуказанной задачи функцией будет выглядеть так (конечно, нам также нужно запустить функцию ex_to_iloc).

def get_df(file_path, start, end):
    ncol = len(pd.read_excel(file_path, nrows=2).columns)
    usecols = range(ex_to_iloc(start), min(ex_to_iloc(end) + 1, ncol))
    return pd.read_excel(file_path, usecols=usecols)

проверить файл Excel

url = 'https://github.com/panda-kim/book1/blob/main/04titanic.xlsx?raw=true'
df = get_df(url, 'B', 'AY')

дф:

 Pclass  Gender   Age     Fare
0  Third    male  22.0   7.2500
1  First  female  38.0  71.2833

Есть ли способ изменить его, чтобы он мог обрабатывать отсутствующие столбцы. Например, если бы мы передали ему B:AY, он все равно вернул бы все, кроме первого столбца? Вот и вся причина, почему я борюсь

Jack 01.07.2024 01:43

@Jack Я немного изменил код, чтобы не выдавать ошибку при вводе несуществующего заголовка, а чтобы получить последний существующий заголовок.

Panda Kim 01.07.2024 02:03

Другие вопросы по теме