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

时间:2017-02-11 20:44:28

标签: python pandas numpy dataframe group-by

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

Zero

我使用以下代码将上述数据框(比如它的变量名称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分组和campaignname,最后按category_type列排序,选择出现的第一行(每组中amount最高的一行。特别针对上面的例子,我是喜欢得到这样的结果:

amount

正如你所看到的,我正在使用(在我看来)“丑陋”的方式来检索每个已排序组的第一行,但由于我是熊猫新手,我不知道更好/更清洁的方法来实现这一目标。如果有人能让我知道从熊猫数据框中选择排序组中第一行的方法,我将非常感激。提前感谢您的回答/建议!

2 个答案:

答案 0 :(得分:4)

IIUC你可以这样做:

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

或:

if (row.Cells[1].Value == (row.Cells[1].Value=true))
{
    // what I want to do
}

答案 1 :(得分:2)

我首选的方法是使用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