基于另一列数据,计算 Pandas 滚动窗口中第二高的值。

5

以下是示例数据:

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
你可以使用 df.groupby("Person").apply(custom_function_to_find_second_highest_sales) - Matt
窗口大小是多少?看起来每次都将窗口大小增加到第二大的大小(在每个步骤中)。 - jch
看看我的解决方案是否适用于你。 - William
1个回答

1
我可以帮您翻译为中文:

虽然不是最优雅的解决方案,但我会按照以下步骤进行:

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和expanding一起:

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)

我在第二步实际数据的索引中遇到了问题,因为我们将数组分配给了df。我无法按原样使其正常工作,但我使用了data_groupby ['Sales'] .rolling(30,2).apply(lambda x:pd.Series(x).nlargest(2).iloc [-1] )。值 - Ksh
好的。如果您的原始数据集看起来像您上面提供的示例,那么我的解决方案应该可以工作。如果您的数据不同,您也可以分享一个最小的示例。这里有一个笔记本重现上面的示例:https://colab.research.google.com/drive/1Z3QRTAkDNy7phJ-VKBUIy3OD50K-tNL-?usp=sharing - William

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接