从pandas数据fram中选择排序组的第一行

2024-05-19 14:31:28 发布

您现在位置:Python中文网/ 问答频道 /正文

假设,我在pandas中有一个数据帧,如下所示:

campaignname    category_type    amount
A               cat_A_0            2.0
A               cat_A_1            1.0
A               cat_A_2            3.0
A               cat_A_2            3.0
A               cat_A_2            4.0
B               cat_B_0            3.0
C               cat_C_0            1.0
C               cat_C_1            2.0

我使用以下代码按不同的列对上述数据帧进行分组(假设它被分配了变量名df),如下所示:

for name, gp in df.groupby('campaignname'):
    sorted_gp = gp.groupby(['campaignname', 'category_type']).sum().sort_values(['amount'], ascending=False)
    # I'd like to know how to select this in a cleaner/more concise way
    first_row = [sorted_gp.iloc[0].name[0], sorted_gp.iloc[0].name[1], sorted_gp.iloc[0].values.tolist()[0]]

上述代码的目的是首先groupby原始数据在campaignname列上,然后在每个结果组中,我希望再次按campaignnamecategory_type分组,最后,按amount列排序以选择出现的第一行(每组中amount最高的一行)。特别是上面的例子,我想得到这样的结果:

first_row = ['A', 'cat_A_2', 4.0] # for the first group
first_row = ['B', 'cat_B_0', 3.0] # for the second group
first_row = ['C', 'cat_C_1', 2.0] # for the third group

等等

如您所见,我使用了一种相当(在我看来)的“丑陋”方法来检索每个排序组的第一行,但是由于我是熊猫新手,我不知道更好/更干净的方法来完成这项工作。如果有人能告诉我如何从pandas数据框中选择排序组中的第一行,我将非常感激。提前感谢您的回答/建议!


Tags: 数据namefor排序typeamountcatrow
2条回答

你可以这样做:

In [83]: df.groupby('campaignname', as_index=False) \
           .apply(lambda x: x.nlargest(1, columns=['amount'])) \
           .reset_index(level=1, drop=1)
Out[83]:
  campaignname category_type  amount
0            A       cat_A_2     4.0
1            B       cat_B_0     3.0
2            C       cat_C_1     2.0

或:

In [76]: df.sort_values('amount', ascending=False).groupby('campaignname').head(1)
Out[76]:
  campaignname category_type  amount
4            A       cat_A_2     4.0
5            B       cat_B_0     3.0
7            C       cat_C_1     2.0

我更喜欢的方法是使用idxmax。它返回最大值的索引。我随后使用该索引对df进行切片

df.loc[df.groupby('campaignname').amount.idxmax()]

  campaignname category_type  amount
4            A       cat_A_2     4.0
5            B       cat_B_0     3.0
7            C       cat_C_1     2.0

相关问题 更多 >