【问题标题】:Sort, rank, groupby and sum combined -> Python pandas排序、排名、groupby 和 sum 组合 -> Python pandas
【发布时间】:2018-11-05 00:33:00
【问题描述】:

我有一个带有段落对的 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”的数量以及这些“1”出现在前 x 个结果中的次数? (x 是基于该段落的“1”总数。如果有七个“1”,我会查看前七个结果)

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

因此我想提取该信息:

1) 总分 1 = 3

2) 前 3 个中的 1 = 2

【问题讨论】:

    标签: python pandas sorting grouping


    【解决方案1】:

    我不明白“标签”列是否只有数字,或者条目是否像显示的那样(即“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
    

    【讨论】:

    • 嗨丹尼尔!谢谢您的回答!计算总数的第一行效果很好,但是对于百分比 - 我的问题是每个百分比都是基于该段落的“总数”......因此每个段落的 x 都会发生变化。我可以以某种方式循环并计算前 x 行中“1”的总数(x 是该段落的总数)吗?所以最终结果是: 1) 第 1 段 | 3(共 1 秒)| 2(该段落前 3 行中 1 的数量)等等
    • 用我的公式,你得到的是:第1段| 3(共 1 秒)| 0.66(前 3 行中 1 的百分比,即 2/3)。如果你只想有“2”,不要除以 x.sum()
    • 关于不同组(即段落)的循环:这正是 groupby + apply 所做的:它评估每个组的函数,在我们的例子中是每个段落
    猜你喜欢
    • 2017-02-07
    • 1970-01-01
    • 2017-07-04
    • 2015-03-06
    • 2015-01-17
    • 2019-08-16
    • 2022-01-16
    • 2014-07-21
    • 2018-08-01
    相关资源
    最近更新 更多