Есть ли способ заставить панд игнорировать отсутствующие столбцы в 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 Я бы хотел, но не повезло. Одинарные кавычки не имеют значения
Ага. Вы можете использовать вызываемую функцию с параметром 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».
Возможно, вам придется создать собственный список, содержащий A, B, ...AY для желаний_столбцов.
Черт возьми, даже если вы преобразуете диапазон Excel в список, это не сработает, поскольку pandas передает в функцию usecols заголовки столбцов, а не индекс. Отредактировал свой вопрос выше.
Сначала создайте специальную функцию для заголовка 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 Я немного изменил код, чтобы не выдавать ошибку при вводе несуществующего заголовка, а чтобы получить последний существующий заголовок.
это может не вызвать такой проблемы, но будьте осторожны, ваши кавычки являются «умными кавычками»
“"