Как посчитать статистику по частично агрегированным данным

Я пытаюсь проанализировать некоторые данные о позиции.

Вот значительно упрощенный пример:

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
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Другие вопросы по теме