У меня в настоящее время есть следующая структура данных в кадре данных pandas после импорта файла * .txt через read_csv:
label text
0 ###24293578 NaN
1 INTRO Some text...
2 METHODS Some text...
3 METHODS Some text...
4 METHODS Some text...
5 RESULTS Some text...
6 ###24854809 NaN
7 BACKGROUND Some text...
8 INTRO Some text...
9 METHODS Some text...
10 METHODS Some text...
11 RESULTS Some text...
12 ###25165090 NaN
13 BACKGROUND Some text...
14 METHODS Some text...
...
Что мне нравится делать, так это запускать индекс для каждой строки, извлекаемый из идентификатора, помеченного "###":
id label text
24293578 INTRO Some text...
24293578 METHODS Some text...
24293578 ... ...
24854809 BACKGROUND Some text...
24854809 ... ...
25165090 BACKGROUND Some text...
25165090 ... ...
В настоящее время я использую следующий код для преобразования данных:
m = df['label'].str.contains("###", na=False)
df['new'] = df['label'].where(m).ffill()
df = df[df['label'] != df['new']].copy()
df['label'] = df.pop('new').str.lstrip('#') + ' ' + df['label']
df[['id','area']] = df['label'].str.split(' ',expand=True)
df = df.drop(columns=['label'])
df
Из:
text id area
1 Some text... 24293578 OBJECTIVE
...
6 Some text... 24854809 BACKGROUND
...
Это делает работу , но я чувствую, что это не лучший подход. Есть ли способ написать более чистый код или сделать его более эффективным? Мне также любопытно, может ли функция a быть непосредственно встроена в шаг read_csv.
Спасибо!