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