如何在多行的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 第一个值并传递给 groupby
和 DataFrameGroupBy.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
我在 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 第一个值并传递给 groupby
和 DataFrameGroupBy.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