Чтение данных Excel, начиная с определенной строки

#python #pandas

Вопрос:

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

Мои данные выглядят так:

Заголовок Еще один заголовок
начните после этого A
07:00 B
08:00 C
09:00 D

и я хотел прочитать данные, начиная с любой строки, до 08:00

Заголовок Еще один заголовок
07:00 B
08:00 C
09:00 D

Я пробовал следующее, но я получаю ошибку, из-за которой он не может найти «08:00» в списке

 df = df[df.index[list(df.index.values).index('08:00') - 1:]]
 

Я был бы признателен за любые намеки, заранее большое спасибо!

Комментарии:

1. Я бы на самом деле написал итерацию здесь явно: повторяйте по строкам, пока не найдете нужный индекс, сохраните индекс, а затем используйте значение позже. Таким образом, будет очевидно, что вы делаете

2. Что возвращается, если совпадения нет?

Ответ №1:

Сравните значения index , преобразованные в Series , чтобы можно было добавить Series.shift для предыдущего совпадения и Series.cummax для следующего True s:

 print (df)
                 Another header
A header                       
start after this              A
07:00                         B
08:00                         C
09:00                         D
 

 print (df[(df.index.to_series() == '08:00').shift(-1,fill_value=False).cummax()])
         Another header
A header               
07:00                 B
08:00                 C
09:00                 D

print (df[(df.index.to_series() == '07:00').shift(-1,fill_value=False).cummax()])
                 Another header
A header                       
start after this              A
07:00                         B
08:00                         C
09:00                         D

print (df[(df.index.to_series() == '09:00').shift(-1,fill_value=False).cummax()])
         Another header
A header               
08:00                 C
09:00                 D

print (df[(df.index.to_series() == '17:00').shift(-1,fill_value=False).cummax()])
Empty DataFrame
Columns: [Another header]
Index: []
 

Комментарии:

1. Это должно сработать, но я автоматически добавляю pandas ad в строку индекса к своим данным. поэтому мне нужно, чтобы скрипт считывал из col[1] вместо col[0], поскольку col[0] — это автоматически сгенерированный индекс col. Изменит ли это решение кардинально?

2. @Кимчи — Если нужно, выберите первый столбец, измените df.index.to_series() на df.iloc[:, 0] или df.iloc[:, 1] , если нужно, выберите второй столбец

3. Блестяще! большое спасибо!

Ответ №2:

Я бы написал итерацию явно, чтобы все было ясно:

 start = 0 # in case we fail to find it later
for i, row in df["Col 1 header"].iteritems():
    if "07:00" in row:
        start = i -1
        break
 

Тогда вы можете просто использовать start с этого момента.