python - 带 Groupby 的加权中位数和 Python 中的聚合

标签 python pandas numpy group-by aggregate

我正在尝试根据多列查找一列的加权中位数。这是一个例子:

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 列的总和。

最初我尝试将包 wquantilesweighted.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/

相关文章:

python-3.x - 在 Windows 上使用 Pip 安装 NumPy

python - 带有字符串的 Pandas Dataframe 上的逻辑

python - 你如何在 Jinja 扩展中解析和注入(inject)额外的节点?

python - 从 for 循环返回 false,否则在 F# 中继续

Python自动化

python - 从 DF 中删除包含重复单词的短语(Pandas、Python3)

python - 基于字典的 Pandas 示例

python - 从向量中减去 scipy.sparse 矩阵的列

python - 带有 numpy ctypes 的大数组

python - 从 Python 通过 Whatsapp 发送文件