Сортировать, ранжировать, группировать и суммировать -> Python pandas - PullRequest
0 голосов
/ 25 мая 2018

У меня есть датафрейм pandas с парами параграфов.Существует около 500 абзацев, и каждый из них указан в виде пары в следующем формате (отсортирован по абзацу A и ранжирован по наибольшему прогнозу):

ParagraphA | paragraphB | label | prediction

Paragraph1 | Pragraph2  | 1 ----| 0.9890


Paragraph1 | Pragraph10  | 1 ----| 0.9870


Paragraph1 | Pragraph17  | 0 ----| 0.9860


Paragraph1 | Pragraph34  | 1 ----| 0.9820

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

sorted_grouped = df.sort_index(by=['paragraphA', 'predictions'], ascending=[True, False])

Это проблема ранжирования, в которой я пытался предсказать вероятность наличия связи между абзацами.Теперь я хотел бы измерить точность, основываясь на количестве реально существующих ссылок (см. «Метка»).

Как бы подсчитать количество «1» под меткой для каждого абзаца (согласно абзацу А), а такжеСколько раз эти '1 появлялись в верхних x результатах?(x основывается на общем количестве «1» для этого абзаца. Если бы было семь «1», я бы посмотрел на верхние семь результатов)

Для моего примера выше, скажем, есть три «1»под ярлыком для Paragraph1, но в верхних трех есть только два '1.

Поэтому я хотел бы извлечь эту информацию:

1) Всего 1 = 3

2) 1 в топе 3 = 2

1 Ответ

0 голосов
/ 25 мая 2018

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

df['new_label'] = df['label'].astype(str).str[0]
df['new_label'] = df['new_label'].astype(int)

Игнорировать этот отрывок, если столбец «label» уже заполнен только числами, и использовать «label» вместо «new_label» вследующее (я также предполагаю, что значения в столбце 'new_label' только 0 или 1):

 total = df.groupby('ParagraphA')['new_label'].sum() # this gives you the number of 1s
percentage = df.groupby('ParagraphA')['new_label'].apply(lambda g : g.head(g.sum()).sum() / g.sum()) # this gives you the percentage of 1s in the first x rows
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...