排序,排名,分组和总和 - > Python熊猫

时间:2018-05-25 15:00:06

标签: python pandas sorting grouping

我有一个带有段落对的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])

这是一个排名问题,我试图预测段落之间存在链接的可能性。我现在想根据实际存在的链接数来衡量精度(参见'标签')。

我如何计算每个段落(在A段下)的标签下的数量,以及这些' 1出现在前x个结果中的次数? (x基于该段的' 1的总数。如果有七个&1 39,我会查看前七个结果)

对于上面的示例,我们假设Paragraph1的标签下面总共有三个,但在前三个中,只有两个' 1' 1'秒。

我想提取该信息:

1)总体1' s = 3

2)1' s在前3 = 2

1 个答案:

答案 0 :(得分:0)

我还没有理解列“label”是否只有数字,或者条目是否与显示的那样(即'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