#python #pandas #string #dataframe
#python #панды #строка #фрейм данных
Вопрос:
Я хотел бы преобразовать строку текста из документа в фрейм данных со столбцами для раздела, докладчика, роли и текста.
Мои входные данные выглядят следующим образом. Я уже извлек список динамиков из другого раздела документа, и каждый динамик играет одну и ту же роль во всем документе, и эта роль указана под динамиком каждый раз, когда они говорят. Спикеры и роли — это текст, а не просто обозначенный номером, в самом документе — я просто называю их Speaker1 и Role1 для простоты в этом примере.
all_text = """Section1nSpeaker1nRole1nThis is the text spoken by the first speaker. Sometimes it contains
the string Speaker1, but when Speaker1 is in the words spoken section it is not on its own line.
Speaker2nRole2nNow someone else is talking.
Section2nSpeaker2nRole2nMore wordsnSpeaker1nRole1nMore wordsnSpeaker2nRole2
People can speak multiple times per section."""
section_list = ["Section1","Section2"]
speaker_list = ["Speaker1","Speaker2"]
Итак, all_text выглядит так:
print(all_text)
Section1
Speaker1
Role1
This is the text spoken by the first speaker. Sometimes it contains
the string Speaker1, but when Speaker1 is in the words spoken section it is not on its own line.
Speaker2
Role2
Now someone else is talking.
Section2
Speaker2
Role2
More words
Speaker1
Role1
More words
Speaker2
Role2
People can speak multiple times per section.
Я хотел бы создать следующий выходной фрейм данных:
Section Speaker Role Text
0 Section1 Speaker1 Role1 This is the text spoken by the first speaker. ...
1 Section1 Speaker2 Role2 Now someone else is talking.
2 Section2 Speaker2 Role2 More Words
3 Section2 Speaker1 Role1 More words
4 Section2 Speaker2 Role2 People can speak multiple times per section.
Заранее благодарим вас за любую помощь!
Ответ №1:
С предоставленными вами данными будет очень сложно правильно извлечь данные.
Поэтому мне пришлось немного подправить данные, добавив раздел для каждого из них.
import pandas as pd
all_text = """Section1nSpeaker1nRole1nThis is the text spoken by the first speaker. Sometimes it contains the string Speaker1, but when Speaker1 is in the words spoken section it is not on its own line.
Section1nSpeaker2nRole2nNow someone else is talking.
Section2nSpeaker2nRole2nMore wordsnSection2nSpeaker1nRole1nMore wordsnSection2nSpeaker2nRole2
People can speak multiple times per section."""
li = all_text.splitlines()
speaker = []
section = []
role = []
text = []
print(li)
for index, item in enumerate(li):
cat = index % 4
print(cat, item)
if cat == 0:
section.append(item)
elif cat == 1:
speaker.append(item)
elif cat == 2:
role.append(item)
else:
text.append(item)
data_dict = {"Section": section, "Speaker": speaker, "Role": role, "text": text}
print(speaker, section, role, text)
df = pd.DataFrame(data_dict)
print(df)
Я полагаю, что это не тот ответ, которого вы ожидаете.
Если вы не хотите изменять свои данные, то нам ЛИБО нужно:
- Список названий разделов. (Это может быть использовано для определения того, изменился ли раздел при обработке данных)
section_list = [«Section1», «Section2»,..]
import pandas as pd
all_text = """Section1nSpeaker1nRole1nThis is the text spoken by the first speaker. Sometimes it contains the string Speaker1, but when Speaker1 is in the words spoken section it is not on its own line.
Speaker2nRole2nNow someone else is talking.
Section2nSpeaker2nRole2nMore wordsnSpeaker1nRole1nMore wordsnSpeaker2nRole2
People can speak multiple times per section."""
li = all_text.splitlines()
section_list = ["Section1", "Section2", "Section3"]
speaker = []
section = []
role = []
text = []
temp_section = ""
section_list = ["Section1", "Section2", "Section3"]
for index, item in enumerate(li):
cat = index % 4
print(temp_section, "*", index, "*", item)
if cat == 0 and item not in section_list:
li.insert(index, temp_section)
section.append(temp_section)
continue
if cat == 0:
section.append(item)
temp_section = item
elif cat == 1:
speaker.append(item)
elif cat == 2:
role.append(item)
else:
text.append(item)
data_dict = {"Section": section, "Speaker": speaker, "Role": role, "text": text}
print(speaker, section, role, text)
df = pd.DataFrame(data_dict)
print(df)
или
2. Нам нужно количество строк, которые у вас будут для каждого раздела.(также для определения изменения раздела)
Count_section = { «Раздел1»: 2, «Раздел2»:3,… }
Комментарии:
1. Спасибо! У меня есть метки разделов с самого начала, поэтому я думаю, что пункт (1) из конца вашего вопроса удовлетворен, если я не неправильно понимаю, что вы говорите. Я не буду заранее знать количество строк для каждого раздела, поэтому (2) Я не думаю, что смогу получить информацию из данных.
2. @Nathan добавил код с точными данными, как у вас, и с перечнем разделов перед рукой.