#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
с этого момента.