![](/img/trans.png)
[英]Pandas Dataframe - GroupBy key and keep max value on a another column
[英]Pandas groupby with identification of an element with max value in another column
我有一個 dataframe 具有不同定價規則的商品的銷售結果:
import pandas as pd
from datetime import timedelta
df_1 = pd.DataFrame()
df_2 = pd.DataFrame()
df_3 = pd.DataFrame()
# Create datetimes and data
df_1['item'] = [1, 1, 2, 2, 2]
df_1['date'] = pd.date_range('1/1/2018', periods=5, freq='D')
df_1['price_rule'] = ['a', 'b', 'a', 'b', 'b']
df_1['sales']= [2, 4, 1, 5, 7]
df_1['clicks']= [7, 8, 9, 10, 11]
df_2['item'] = [1, 1, 2, 2, 2]
df_2['date'] = pd.date_range('1/1/2018', periods=5, freq='D')
df_2['price_rule'] = ['b', 'b', 'a', 'a', 'a']
df_2['sales']= [2, 3, 4, 5, 6]
df_2['clicks']= [7, 8, 9, 10, 11]
df_3['item'] = [1, 1, 2, 2, 2]
df_3['date'] = pd.date_range('1/1/2018', periods=5, freq='D')
df_3['price_rule'] = ['b', 'a', 'b', 'a', 'b']
df_3['sales']= [6, 5, 4, 5, 6]
df_3['clicks']= [7, 8, 9, 10, 11]
df = pd.concat([df_1, df_2, df_3])
df = df.sort_values(['item', 'date'])
df.reset_index(drop=True)
df
結果是:
item date price_rule sales clicks
0 1 2018-01-01 a 2 7
0 1 2018-01-01 b 2 7
0 1 2018-01-01 b 6 7
1 1 2018-01-02 b 4 8
1 1 2018-01-02 b 3 8
1 1 2018-01-02 a 5 8
2 2 2018-01-03 a 1 9
2 2 2018-01-03 a 4 9
2 2 2018-01-03 b 4 9
3 2 2018-01-04 b 5 10
3 2 2018-01-04 a 5 10
3 2 2018-01-04 a 5 10
4 2 2018-01-05 b 7 11
4 2 2018-01-05 a 6 11
4 2 2018-01-05 b 6 11
我的目標是:
1.按天分組所有項目(為每個項目和給定日期獲取一行)
2. 用“sum”聚合“clicks”
3.生成一個“winning_pricing_rule”列,如下所示:
- 對於給定項目和給定日期,采用具有最高“銷售”價值的定價規則 - 在“平局”的情況下(參見例如:上面示例中 2018-01-03 的項目 2):僅選擇其中一個(這在我的數據集中很少見,所以它可以是隨機的......)
我想結果看起來像這樣:
item date winning_price_rule clicks
0 1 2018-01-01 b 21
1 1 2018-01-02 a 24
2 2 2018-01-03 b 27 <<remark: could also be a (due to draw)
3 2 2018-01-04 a 30 <<remark: could also be b (due to draw)
4 2 2018-01-05 b 33
我試過了:
a.groupby(['item', 'date'], as_index = False).agg({'sales':'sum','revenue':'max'})
但未能確定成功的定價規則。
有任何想法嗎? 非常感謝您的幫助:)
安迪
首先通過DataFrame.set_index
將列price_rule
轉換為索引,因此對於winning_price_rule
可以使用DataFrameGroupBy.idxmax
- 通過GroupBy.agg
中的最大sales
獲取索引值,因為也是必要的sum
:
df1 = (df.set_index('price_rule')
.groupby(['item', 'date'])
.agg({'sales':'idxmax', 'clicks':'sum'})
.reset_index())
對於 pandas 0.25.+ 可以使用:
df1 = (df.set_index('price_rule')
.groupby(['item', 'date'])
.agg(winning_pricing_rule=pd.NamedAgg(column='sales', aggfunc='idxmax'),clicks=pd.NamedAgg(column='clicks', aggfunc="sum'))
.reset_index())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.