Python Groupby n—基于一列的最大值,有条件地基于第二列

Python Groupby n—基于一列的最大值,有条件地基于第二列,python,pandas,dataframe,pandas-groupby,data-analysis,Python,Pandas,Dataframe,Pandas Groupby,Data Analysis,我有以下数据集: individual cluster choice benchmark_probabilities 0 9710535 0 0 0.008647 1 9710535 2 0 0.012558 2 9710535 2 0 0.013894 3 971053

我有以下数据集:

    individual  cluster  choice  benchmark_probabilities
0      9710535        0       0                 0.008647
1      9710535        2       0                 0.012558
2      9710535        2       0                 0.013894
3      9710535        1       0                 0.030648
4      9710535        1       0                 0.020298
5      9710535        1       0                 0.021444
6      9710535        1       0                 0.014804
7      9710535        5       0                 0.163837
8      9710535        5       0                 0.085191
9      9710535        2       0                 0.013272
10     9710535        2       0                 0.014684
11     9710535        2       0                 0.006987
12     9710535        2       0                 0.007387
13     9710535        2       0                 0.008940
14     9710535        3       0                 0.027746
15     9710535        3       0                 0.017345
16     9710535        3       0                 0.015545
17     9710535        4       0                 0.007449
18     9710535        3       0                 0.013382
19     9710535        4       0                 0.011559
20     9710535        3       0                 0.013091
21     9710535        4       0                 0.006438
22     9710535        4       0                 0.006089
23     9710535        4       0                 0.007768
24     9710535        4       0                 0.007348
25     9710535        2       0                 0.001479
26     9710535        5       0                 0.054764
27     9710535        5       0                 0.065420
28     9710535        5       0                 0.098600
29     9710535        5       0                 0.067577
30     9710535        6       0                 0.002158
31     9710535        6       0                 0.002041
32     9710535        6       0                 0.001694
33     9710535        6       0                 0.001602
34     9710535        7       0                 0.010075
35     9710535        7       0                 0.008076
36     9710535        7       0                 0.004485
37     9710535        7       0                 0.009090
38     9710535        7       0                 0.005834
39     9710535        5       0                 0.018973
40     9710535        7       0                 0.014945
41     9710535        7       0                 0.007159
42     9710535        6       0                 0.001624
43     9710535        6       0                 0.001535
44     9710535        5       0                 0.048068
45     9710535        7       0                 0.003548
46     9710540        0       1                 0.018614
47     9710540        0       0                 0.006515
48     9710540        0       0                 0.004040
49     9710540        1       0                 0.005489
我想做的是:

  • 个人
    集群
    分组,并从每组中选择前1名 基于基准概率
  • 根据
    个人
  • 如果一个
    个体
    具有少于5个唯一的
    , 然后根据
    基准概率
    不考虑集群
  • 结果应该如下所示:

        individual  cluster  choice  benchmark_probabilities
    0     9710535        1       0                 0.030648
    1     9710535        5       0                 0.163837
    2     9710535        3       0                 0.027746
    3     9710535        8       0                 0.015682
    4     9710535       11       1                 0.050787
    5     9710540        0       0                 0.004040
    6     9710540        1       0                 0.005489
    7     9710540        0       0                 0.006515
    8     9710540        0       1                 0.018614
    
    我已经做了以下工作,这给了我第一和第二阶段,但不是第三阶段:

    data.groupby([“个人”、“集群])[“基准概率”].nlargest(1).groupby(“个人”).nlargest(5)
    
    但结果不是我想要的,而且看起来也很难看:

    individual  individual  cluster     
    9710535     9710535     5        7      0.163837
                            11       75     0.050787
                            1        3      0.030648
                            3        14     0.027746
                            8        49     0.015682
    9710540     9710540     0        98     0.018614
                            1        101    0.005489
    
    任何帮助都将不胜感激

    我认为您需要使用更大的
    NLAGEST
    ,因为这样可以避免丢失
    选项
    列,而且性能更好:

    df0 = (data.groupby(["individual", "cluster"])["benchmark_probabilities"].nlargest(1)
               .groupby("individual").nlargest(5))
    print (df0)
    individual  individual  cluster    
    9710535     9710535     5        7     0.163837
                            1        3     0.030648
                            3        14    0.027746
                            7        40    0.014945
                            2        10    0.014684
    9710540     9710540     0        46    0.018614
                            1        49    0.005489
    Name: benchmark_probabilities, dtype: float64
    
    df1 = (data.sort_values(['individual','cluster','benchmark_probabilities'],
                             ascending=[True, True, False])
               .groupby(["individual", "cluster"]).head(1)
               .sort_values(['individual','benchmark_probabilities'], 
                            ascending=[True, False])
               .groupby("individual").head(5))
    print (df1)
        individual  cluster  choice  benchmark_probabilities
    7      9710535        5       0                 0.163837
    3      9710535        1       0                 0.030648
    14     9710535        3       0                 0.027746
    40     9710535        7       0                 0.014945
    10     9710535        2       0                 0.014684
    46     9710540        0       1                 0.018614
    49     9710540        1       0                 0.005489
    
    然后仅过滤原始数据中的行,不在
    df1
    中,并进行排序:

    df2 = (data[~data.index.isin(df1.index)]
               .sort_values(['individual','benchmark_probabilities'], 
                            ascending=[True, False])
               )
    #print (df2)
    
    添加了t
    df1
    ,并通过
    head
    获得前5名值:

    df = (pd.concat([df1, df2])
            .groupby('individual').head(5)
            .sort_values('individual'))
    print (df)
        individual  cluster  choice  benchmark_probabilities
    7      9710535        5       0                 0.163837
    3      9710535        1       0                 0.030648
    14     9710535        3       0                 0.027746
    40     9710535        7       0                 0.014945
    10     9710535        2       0                 0.014684
    46     9710540        0       1                 0.018614
    49     9710540        1       0                 0.005489
    47     9710540        0       0                 0.006515
    48     9710540        0       0                 0.004040
    

    数据的输出是什么。groupby([“个人”,“集群])[“基准概率”]。nlargest(1)。groupby(“个人”)。nlargest(5)
    ?我添加了结果。它看起来很难看,也没有添加那些“缺少的”选项,只是我问了一下,因为我得到了不同的输出,添加到了回答
    print(df0)
    这是我的错。这个“小”样本似乎太大,无法粘贴到这里。它会扰乱眼睛。因此,我对它进行了一些剪切并手动计算:)但是脚本是使用完整的数据集运行的。我想展示这种丑陋和不完整的结果OK,所以我希望解决方案能很好地工作。关于这种方法,我有一个问题。假设
    个体
    有两个簇,最高概率分别为0.5和0.03,但第一个簇的总体“概率”远大于第二个簇的顶部。当我们在创建
    df2
    后连接并获得前5名时,我们有可能失去第二个集群的前5名选项。我们不是吗?@EmilMirzayev-hmmm,
    df1
    “个人”
    的前5名,所以
    df2
    只在缺少一些行(
    9710540
    )的情况下使用,如果没有缺少(
    9710535
    ),则没有附加任何内容。我这样做是因为当我创建
    df2
    时,它拥有数据集的所有剩余行,这就是我的意图。因此,连接是水平进行的,即使这些行被添加,它们也是在
    df1
    结果之后添加的,因此即使您使用
    head(5)
    也不会影响结果。这个结论正确吗?@EmilMirzayev-我想是的,如果不是为
    个人
    添加5个值,如果
    5个值
    则忽略行。@jezrael找到你了,先生~谢谢你提供的信息~:-)