Esta es la solución más correcta que encomtrarás compartir, pero estúdiala detenidamente y analiza si es compatible a tu proyecto.
Solución:
Si quieres hacer esto en pandas puros, aquí hay una manera. Tampoco interpola. (@svenkatesh, te faltaba la suma acumulada en tu pseudocódigo)
df.sort_values('impwealth', inplace=True)
cumsum = df.indweight.cumsum()
cutoff = df.indweight.sum() / 2.0
median = df.impwealth[cumsum >= cutoff].iloc[0]
Esto da una mediana de 925000.
¿Has probado el paquete wquantiles? Nunca lo había usado antes, pero tiene una función de mediana ponderada que parece dar al menos una respuesta razonable (probablemente querrá volver a verificar que esté usando el enfoque que espera).
In [12]: import weighted
In [13]: weighted.median(df['impwealth'], df['indweight'])
Out[13]: 914662.0859091772
Esta función generaliza la solución del corrector:
def weighted_median(df, val, weight):
df_sorted = df.sort_values(val)
cumsum = df_sorted[weight].cumsum()
cutoff = df_sorted[weight].sum() / 2.
return df_sorted[cumsum >= cutoff][val].iloc[0]
En este ejemplo sería weighted_median(df, 'impwealth', 'indweight')
.
Puedes estimular nuestra faena ejecutando un comentario o dejando una puntuación te estamos eternamente agradecidos.