Преобразование строки в фрейм данных динамиков и текста

#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)
 

Я полагаю, что это не тот ответ, которого вы ожидаете.

Если вы не хотите изменять свои данные, то нам ЛИБО нужно:

  1. Список названий разделов. (Это может быть использовано для определения того, изменился ли раздел при обработке данных)

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 добавил код с точными данными, как у вас, и с перечнем разделов перед рукой.