Tôi có một dataframe trông như thế này:Python: trọng số thuật toán trung bình với gấu trúc
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
tôi muốn để tính trung bình có trọng số của các cột impwealth
sử dụng các trọng số tần số trong indweight
. mã giả của tôi trông như thế này:
# 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']
phương pháp này có vẻ vụng về, và tôi không chắc chắn đó là chính xác. Tôi đã không tìm thấy một cách xây dựng để làm điều này trong tham chiếu gấu trúc. Cách tốt nhất để đi về việc tìm kiếm trung bình có trọng số là gì?
Bạn có chắc chắn mã giả của bạn là chính xác? 'df ['indweight']. sum() * (.5)' sẽ cho một giá trị '219' mà không có giá trị' indweight' nào của bạn vượt quá. Gọi 'df ['indweight']. Median()' cho 44.835 và 'mean()' cho 43.783 – EdChum
Tôi nghĩ vậy .. 'df ['indweight']. Sum() * (.5)' nên tính số lượng các quan sát nằm dưới phân vị thứ 50 trong dữ liệu, vì 'indweight' là trọng số tần số. Vì vậy, nó có ý nghĩa rằng trung bình và trung bình của 'indweight' vượt quá tổng của nó. – svenkatesh
@svenkatesh, bạn cần sử dụng '' .cumsum() '' của '' indweight'', không phải '' indweight''. Xem câu trả lời của tôi dưới đây, có lẽ. – prooffreader