[英]How to get second highest value in a pandas column for a certain ID?
[英]Pandas Rolling second Highest Value based on another column
對於以下示例數據:
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.