我正在尝试分析一些订单项数据。
这是一个非常简化的示例:
df = pd.DataFrame({
'quantity':[3,4,1],
'unit_cost':[50,80,60]
})
df
quantity unit_cost
0 3 50
1 4 80
2 1 60
我想计算每个单位的统计数据,包括中位数。对于此示例,中位数为 70。
有没有办法在不先分解数量的情况下做到这一点?
我尝试像下面这样分解每一行,但实际数据的资源需求非常大。
disagDf
quantity unit_cost
0 1 50
0 1 50
0 1 50
1 1 80
1 1 80
1 1 80
1 1 80
2 1 60
IIUC 你可以做:
# https://stackoverflow.com/a/73905572/10035985
def weighted_quantiles_interpolate(values, weights, quantiles=0.5):
i = np.argsort(values)
c = np.cumsum(weights[i])
q = np.searchsorted(c, quantiles * c[-1])
return np.where(
c[q] / c[-1] == quantiles, 0.5 * (values[i[q]] + values[i[q + 1]]), values[i[q]]
)
df = pd.DataFrame({"quantity": [3, 4, 1], "unit_cost": [50, 80, 60]})
print(
weighted_quantiles_interpolate(
df["unit_cost"].values, weights=df["quantity"].values
)
)
打印:
70.0