如何在多行的1列中取每个类别的最大值

How to take the max value of each category in 1 column across multiple rows

我在 Jupyternotebook 上使用 Python 3.4。

我正在寻找 select 下面 table 每个产品类型的最大值。我找到了如下所示的 groupby 代码,但我正在努力弄清楚如何进行搜索,以便它考虑到所有框的最大值(box_1 和 box_2),等等。

也许最好将其描述为某种模糊匹配?

理想情况下,我的输出应该给我每个类别中的最大值: box_2 18 bottles_3 31 . . .

我应该怎么做?

data = {'Product':['Box_1','Bottles_1','Pen_1','Markers_1','Bottles_2','Pen_2','Markers_2','Bottles_3','Box_2','Markers_2','Markers_3','Pen_3'], 
        'Sales':[14,24,31,12,13,7,9,31,18,16,18,14]}
 
df1=pd.DataFrame(data, columns=['Product','Sales']) 
df1

df1.groupby(['Product'])['Sales'].max()

您可以通过索引 str[0] 将值拆分为 _,select 第一个值并传递给 groupbyDataFrameGroupBy.idxmax for Product按最大值 Sales:

df1 = df1.set_index('Product')
df2 = (df1.groupby(df1.index.str.split('_').str[0])['Sales']
          .agg([('Product','idxmax'), ('Sales','max')])
          .reset_index(drop=True))
print (df2)
     Product  Sales
0  Bottles_3     31
1      Box_2     18
2  Markers_3     18
3      Pen_1     31
    

给你:

df1['Type'] = df1.Product.str.split('_').str.get(0)
df1.groupby(['Type'])['Sales'].max()

## -- End pasted text --
Out[1]: 
Type
Bottles    31
Box        18
Markers    18
Pen        31
Name: Sales, dtype: int64

如果我没理解错的话,你先要看分类,然后把商品名称和最大值都检索出来。以下是如何做到这一点:

df1=pd.DataFrame(data, columns=['Product','Sales']) 

df1['Category'] = df1.Product.str.split('_').str.get(0)

df1["rank"] = df1.groupby("Category")["Sales"].rank("dense", ascending=False)

df1[df1["rank"]==1.0][['Product','Sales']]

排名功能将根据销售额对类别中的产品进行排名。然后,您需要过滤掉排名较低的任何类别。这将为您提供所需的数据框:

    Product     Sales
2   Pen_1       31
7   Bottles_3   31
8   Box_2       18
10  Markers_3   18