Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过标识另一列中具有最大值的元素创建groupby_Python_Pandas_Group By_Greatest N Per Group - Fatal编程技术网

Python 通过标识另一列中具有最大值的元素创建groupby

Python 通过标识另一列中具有最大值的元素创建groupby,python,pandas,group-by,greatest-n-per-group,Python,Pandas,Group By,Greatest N Per Group,我有一个数据框,其中包含具有不同定价规则的商品的销售结果: 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', pe

我有一个数据框,其中包含具有不同定价规则的商品的销售结果:

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.用“总和”聚合“点击次数”
3. 生成“获胜定价规则”列,如下所示:
-对于给定的项目和给定的日期,采用具有最高“销售额”值的定价规则 -在“抽签”的情况下(参见上文样本中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
但未能确定一个成功的定价规则

有什么想法吗?非常感谢您的帮助:)


Andy

首先将列
price\u规则
转换为索引,因此对于
winning\u price\u规则
可以使用-按中的最大
sales
获取索引值,因为这也是必要的聚合
sum

df1 = (df.set_index('price_rule')
         .groupby(['item', 'date'])
         .agg({'sales':'idxmax', 'clicks':'sum'})
         .reset_index())
对于熊猫,可使用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())

好啊但是点击呢?在您的示例中,“单击”列汇总了“销售”。在我的情况下,我需要原始df的所有点击总数(例如2018-01-01的第1项为21次。??@Andrzej Wodeck对不起,你是对的,答案已编辑。
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())