Tôi đang làm một số thống kê.
Tôi có khung dữ liệu:
tagabcdef
a 5 2 3 2 0 1
b 2 4 3 2 0 1
c 3 4 3 2 0 3
d 2 4 3 2 0 1
đ 0 4 3 2 0 8
f 1 4 3 2 0 1
Tôi muốn tạo khung dữ liệu mới:
tagabcdef
một 0x
b 0
c 0
d 0
e 0 Y
f 0
trong đó x bằng phần tử tương ứng tại vị trí đó chia cho tổng các phần tử trong hàng đó, không bao gồm các phần tử trên đường chéo. Vậy X là:X = 2/(2+3+2+0+1)
例如 Y = 8/(0+4+3+2+8)
Sau đó mình cần thêm một cột nữa để tính: -sum[mỗi phần tử trong hàng * log(của phần tử đó)]
Tôi xin lỗi vì câu hỏi tầm thường này, tôi đã từng làm việc trong R và để thực hiện nhiệm vụ này, tôi cần phải làm việc với gấu trúc.
sử dụngnp.fill_diagonal
Che dấu các phần tử đường chéo và sau đó sử dụngDataFrame.div
Thực hiện phép chia căn chỉnh theo chỉ số:
u = df.set_index('tag')
np.fill_diagonal(u.values, 0)
v = u.div(u.sum(axis=1), axis=0)
v
abcdef
nhãn
a 0,00 0,250000 0,375000 0,250000 0,0 0,125000
b 0,25 0,000000 0,375000 0,250000 0,0 0,125000
c 0,25 0,333333 0,000000 0,166667 0,0 0,250000
d 0,20 0,400000 0,300000 0,000000 0,0 0,100000
e 0,00 0,235294 0,176471 0,117647 0,0 0,470588
f 0,10 0,400000 0,300000 0,200000 0,0 0,000000
"Sau đó tôi cần thêm một cột nữa để tính: -sum[mỗi phần tử trong hàng * log(của phần tử đó)]"
bạn có thể làm điều này
v['log_sum'] = -np.ma.masked_invalid(v * np.log(v)).sum(1)
v
abcdef log_sum
nhãn
a 0,00 0,250000 0,375000 0,250000 0,0 0,125000 -8,965402
b 0,25 0,000000 0,375000 0,250000 0,0 0,125000 -8,965402
c 0,25 0,333333 0,000000 0,166667 0,0 0,250000 -8,461294
d 0,20 0,400000 0,300000 0,000000 0,0 0,100000 -9,560926
e 0,00 0,235294 0,176471 0,117647 0,0 0,470588 -9,708363
f 0,10 0,400000 0,300000 0,200000 0,0 0,000000 -9,560926
Tôi là một lập trình viên xuất sắc, rất giỏi!