我正在尝试根据多列查找一列的加权中位数。这是一个例子:
Date | Item | BetterPrice | TotalCost | Location
-------------------------------------------------------------------------
2022-03-01 | AB | 0 | 200 | 3
2022-03-01 | AB | 0 | 200 | 2
2022-03-01 | AB | 1 | 300 | 3
2022-03-01 | AC | 1 | 400 | 2
2022-04-01 | AB | 1 | 400 | 1
2022-04-01 | AC | 1 | 100 | 3
2022-04-01 | AC | 0 | 50 | 1
我想找到 Location
列的加权中位数,并且我想使用 TotalCost
列作为权重。我也想使用聚合 TOO,因为我也想找到 BetterPrice 列的总和。
最初我尝试将包 wquantiles
与 weighted.median
函数一起使用,为了完成上述任务,我尝试了类似于以下代码的操作:
import wquantiles
wm = lambda x: weighted.median(x , TotalCost)
df2 = df.groupby(['Date', 'Item']).agg({'BetterPrice': 'sum', "Location": wm}).reset_index()
不幸的是,这似乎不起作用,所以我想我应该试着问一下如何最好地完成这项任务,谢谢!
此外,这里有一个数据框来复制我的上述问题(希望它足够详细)
import pandas as pd
data={'Date':['2022-03-01','2022-03-01','2022-03-01','2022-03-01', '2022-04-01', '2022-04-01', '2022-04-01'],'Item':['AB','AB','AB','AC', 'AB', 'AC', 'AC'],'BetterPrice':[0,0,1,1, 1, 1, 0],'TotalCost':[200,200,300,400, 400, 100, 50],'Location':[3,2,3,2,1,3, 1]}
df=pd.DataFrame(data)
最佳答案
这里有一个方法可以做到这一点。要获得加权中位数,您可以使用 TotalCost 获取 Location 中 np.repeat
值的 np.median
。每组这样做。然后 concat
结果与每组另一列的总和。
gr = df.groupby(['Date', 'Item'])
res = pd.concat(
[gr.apply(lambda x: np.median(np.repeat(x.Location, x.TotalCost))),
gr['BetterPrice'].sum()],
keys=['Loc_weigthed_median','BetterPrice_sum'],
axis=1
).reset_index()
print(res)
# Date Item Loc_weighted_median BetterPrice_sum
# 0 2022-03-01 AB 3.0 1
# 1 2022-03-01 AC 2.0 1
# 2 2022-04-01 AB 1.0 1
# 3 2022-04-01 AC 3.0 1
关于python - 带 Groupby 的加权中位数和 Python 中的聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72779321/