我有一个存储为 pandas DataFrame 的平方成本矩阵。行和列表示位置 [i, j],我想将所有非对角线元素(其中 i != j)乘以常数 c,出于性能原因,不使用任何 for 循环。
是否有一种有效的方法可以在 pandas 中实现此目的,或者我是否必须切换到 numpy,然后再回到 pandas 来执行此任务?
示例
import pandas as pd
# Sample DataFrame
cost_matrix = pd.DataFrame([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
# Constant
c = 4
# Desired output
# 1 8 12
# 16 5 24
# 28 16 9
您可以为所有对角线元素创建一个遮罩
(i!=j)
,应用遮罩,然后乘以非对角线元素:
import pandas as pd
cost_matrix = pd.DataFrame([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
c = 4
# Create a mask where i != j and convert mask to a DataFrame with the same index and columns
mask = cost_matrix.index.values[:, None] != cost_matrix.columns.values
mask_df = pd.DataFrame(mask, index=cost_matrix.index, columns=cost_matrix.columns)
cost_matrix[mask_df] *= c
print(cost_matrix)
这将输出
1 8 12
16 5 24
28 32 9
注意:我认为您在所需的输出中犯了拼写错误。底部中间应该是 32 而不是 16