индексировать столбец данных в отношении других столбцов и - PullRequest
0 голосов
/ 24 января 2020

Я предоставил этот фрейм данных, enter image description here

enter image description here

, как вы видите, у меня есть 3 индексных главы, ParaIndex , (индекс абзаца) и Sentindex (sententcesindex), у меня 70 глав, 1699 абзацев и 6999 предложений

, поэтому каждое из них начинается с начала (0 или 1), проблема в том, что я хочу сделать виджет для вызова «конкретного c предложения», которое помещается в конкретный c абзац главы. что-то вроде этого

https://towardsdatascience.com/interactive-controls-for-jupyter-notebooks-f5c94829aee6, но для извлечения указанных c предложений в конкретном c абзаце указанного c главы

Я думаю, что должен есть другой индекс (например, ChapParaSent ABBREVIATION for all) или даже многомерный индекс, который показывает, что это предложение точно помещено

, любая идея, как я могу предоставить это, используя ipywidget https://ipywidgets.readthedocs.io/en/latest/examples/Using%20Interact.html

@interact
def showDetail( Chapter=(1,70),ParaIndex=(0,1699),SentIndex=(0,6999)):
    return df.loc[(df.Chapter == Chapter) & (df.ParaIndex==ParaIndex)&(df.SentIndex==SentIndex)]

проблема в том, что мы не знаем, в каждой главе, сколько есть абзацев, и мы не знаем в каждом абзаце SentIndex индекс, с которого начинать поиск, с какого числа большую часть времени у нас нет результата.

цель состоит в том, чтобы принять это (или определить новый индекс) таким образом, чтобы при изменении кнопок панели у нас всегда было одно уникальное предложение

, например, здесь у меня есть результат:

enter image description here

но когда я перешел на это:

[3]: https://i.stack.imgur.com/CdKX0.jpg У меня нет никакого результата, ПРИЧИНА очевидна, потому что мы не делаем любой индекс может быть 1-2-1, так как в главе 1 индекс пункта 2: Sentindex начинается с 2!

Одно из решений, которое я увидел, это полное определение многомерного фрейма данных, но мне нужно кое-что проще, что я могу использовать с помощью ipywidget ...

большое спасибо

1 Ответ

1 голос
/ 24 января 2020

Я уверен, что есть более простое решение, но это работает, я думаю.

import pandas as pd

data = [
dict(Chapter=0, ParaIndex=0, SentIndex=0, content="0"),
dict(Chapter=1, ParaIndex=1, SentIndex=1, content="a"),
dict(Chapter=1, ParaIndex=1, SentIndex=2, content="b"),
dict(Chapter=2, ParaIndex=2, SentIndex=3, content="c"),
dict(Chapter=2, ParaIndex=2, SentIndex=4, content="d"),
dict(Chapter=2, ParaIndex=3, SentIndex=5, content="e"),
dict(Chapter=3, ParaIndex=4, SentIndex=6, content="f"),
    ]


df = pd.DataFrame(data)

enter image description here

def showbyindex(target_chapter, target_paragraph, target_sentence):

    df_chapter = df.loc[df.Chapter==target_chapter]
    unique_paragraphs = df_chapter.ParaIndex.unique()
    paragraph_idx = unique_paragraphs[target_paragraph]

    df_paragraph = df_chapter.loc[df.ParaIndex==paragraph_idx]

    return df_paragraph.iloc[target_sentence]



showbyindex(target_chapter=2, target_paragraph=0, target_sentence=1)

enter image description here

Редактировать: Если вы хотите, чтобы ползунки находились только в допустимом диапазоне, вы можете определить IntSliders для вашего интерактивного декоратора:

chapter_slider = widgets.IntSlider(min=0, max=max(df.Chapter.unique()), step=1, value=0)
paragraph_slider = widgets.IntSlider(min=0, max=1, step=1, value=0)
sentence_slider = widgets.IntSlider(min=0, max=1, step=1, value=0)


@interact(target_chapter=chapter_slider, target_paragraph=paragraph_slider, target_sentence=sentence_slider)

Теперь вам нужно проверить правильное количество абзацев / предложений в вашей функции showbyindex и установить ползунки значение / макс соответственно.

if(...):
    paragraph_slider.max = ...
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...