Возможно, это не очень идиоматическое решение для панд, но вы можете cumsum
логический столбец и использовать его, чтобы получить соответствующий заголовок для каждой строки.По сути, мы определяем кусочно-постоянный индексный массив, который увеличивается только для каждого значения True
в исходном столбце heading
.
import pandas as pd
# set up some dummy data
df = pd.DataFrame({'heading': [True, False, False, False, True, False, False]},
index=['heading1', 'foo', 'bar', 'baz', 'heading2', 'quux', 'quuz'])
# get every 'heading' index
headings = df.index[df.heading]
# fetch which row corresponds to which 'heading'
indices = df.heading.cumsum() - 1
# fetch the actual headings for each row
df['parent'] = headings[indices]
print(df)
Вывод приведенного выше кода
heading parent
heading1 True heading1
foo False heading1
bar False heading1
baz False heading1
heading2 True heading2
quux False heading2
quuz False heading2
Из которого вы можете drop
ненужный столбец heading
.Конечно, вы можете напрямую получить имеющийся у вас логический массив и работать с ним:
headline = df.index.str.startswith('heading') # bool Series
headings = df.index[headline]
indices = df.heading.cumsum() - 1
df['parent'] = headings[indices]