У меня есть dataframe, который выглядит следующим образом:Python: взвешенный медианный алгоритм с пандами
Out[14]:
impwealth indweight
16 180000 34.200
21 384000 37.800
26 342000 39.715
30 1154000 44.375
31 421300 44.375
32 1210000 45.295
33 1062500 45.295
34 1878000 46.653
35 876000 46.653
36 925000 53.476
Я хочу, чтобы вычислить взвешенную медиану столбца impwealth
с использованием весов частот в indweight
. Мой псевдо код выглядит следующим образом:
# Sort `impwealth` in ascending order
df.sort('impwealth', 'inplace'=True)
# Find the 50th percentile weight, P
P = df['indweight'].sum() * (.5)
# Search for the first occurrence of `impweight` that is greater than P
i = df.loc[df['indweight'] > P, 'indweight'].last_valid_index()
# The value of `impwealth` associated with this index will be the weighted median
w_median = df.ix[i, 'impwealth']
Этот метод кажется неуклюжим, и я не уверен, что это правильно. Я не нашел встроенного способа сделать это в ссылке pandas. Каков наилучший способ найти взвешенную медианную?
Вы уверены, что ваш псевдо-код является правильным? 'df ['indweight']. sum() * (.5)' даст значение ~ '219', значение которого не превышает ваших значений' indweight'. Вызов 'df ['indweight']. Median()' дает 44.835 и 'mean()' дает 43.783 – EdChum
Я так думаю .. 'df ['indweight']. Sum() * (.5)' должен вычислять число наблюдений, которые подпадают под 50-й процентиль данных, поскольку «лишний вес» является частотным весом. Таким образом, имеет смысл, что средняя и медиана «лишнего веса» превышают его сумму. – svenkatesh
@svenkatesh, вам нужно использовать '' .cumsum() '' 'indweight'', а не' 'indweight''. См. Мой ответ ниже, возможно. – prooffreader