python - Pandas 基于另一列滚动第二高值
问题描述
对于以下示例数据:
data={'Person':['a','a','a','a','a','b','b','b','b','b','b'],
'Sales':['50','60','90','30','33','100','600','80','90','400','550'],
'Price':['10','12','8','10','12','10','13','16','14','12','10']}
data=pd.DataFrame(data)
对于每个人(组),我希望以滚动方式基于第二高销售额的价格,但每个组的窗口会有所不同。结果应如下所示:
result={'Person':['a','a','a','a','a','b','b','b','b','b','b'],
'Sales':['50','60','90','30','33','100','600','80','90','400','550'],
'Price':['10','12','8','10','12','10','13','16','14','12','10'],
'Second_Highest_Price':['','10','12','12','12','','10','10','10','12','10']}
我尝试使用 nlargest(2) 但不确定如何让它滚动工作。
解决方案
这不是最优雅的解决方案,但我会执行以下操作:
1-加载数据集
import numpy as np
import pandas as pd
data={'Person':['a','a','a','a','a','b','b','b','b','b','b'],
'Sales':['50','60','90','30','33','100','600','80','90','400','550'],
'Price':['10','12','8','10','12','10','13','16','14','12','10']}
data=pd.DataFrame(data)
data['Sales'] = data['Sales'].astype(float)
2-使用Groupby并一起扩展:
data['2nd_sales'] = data.groupby('Person')['Sales'].expanding(min_periods=2) \
.apply(lambda x: x.nlargest(2).values[-1]).values
3- 计算Second_Highest_Price
:
data['Second_Highest_Price'] = np.where((data['Sales'].shift() == data['2nd_sales']), data['Price'].shift(),
(np.where((data['Sales'] == data['2nd_sales']), data['Price'], np.nan)))
data['Second_Highest_Price'] = data.groupby('Person')['Second_Highest_Price'].ffill()
输出:
data['Second_Highest_Price'].values
array([nan, '10', '12', '12', '12', nan, '10', '10', '10', '12', '10'],
dtype=object)
推荐阅读
- javascript - 如何使用 ajax 更改 div 中的元素?
- r - 根据特定规则替换 NA 值
- angular - Angular 7 中的 Ion.RangeSlider 更改状态
- java - Stream 类型中的方法 max(Comparator >)
- > 不适用于参数(比较器
) - laravel - Laravel 从关系对象中只获取需要的列
- powershell - Powershell - 如何在Firefox中选择并单击超链接
- node.js - Angular 客户端数据的存储位置,稍后在 REST-API 中用于获取信息
- php - 数组创建重复标签(wordpress)
- ajax - 甜蜜警报正在覆盖循环中的一个警报
- python - JSONDecodeError:期望值:使用 Translate API 的第 1 行第 1 列(字符 0)