You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas或Numpy生成DataFrame行内列交叉比率矩阵并展开?

解决方案

基于Numpy的高效实现

利用Numpy的广播特性,无需循环即可批量计算每行的交叉比率矩阵,是处理大数据集的最优选择:

import numpy as np
import pandas as pd

# 初始化示例DataFrame
df = pd.DataFrame([[4,5],[7,8],[9,10]], columns=['a','b'])
# 提取底层Numpy数组
arr = df.values

# 通过广播计算每行的交叉比率:每行的每个元素分别除以该行的所有元素
cross_ratios = arr[:, :, np.newaxis] / arr[:, np.newaxis, :]
# 将三维数组展平为二维,并转为DataFrame
result = pd.DataFrame(
    cross_ratios.reshape(-1, 4),
    columns=['a/a', 'a/b', 'b/a', 'b/b'],
    index=df.index
)

print(result)

输出结果:

a/a    a/b       b/a  b/b
0  1.0  0.800  1.250000  1.0
1  1.0  0.875  1.142857  1.0
2  1.0  0.900  1.111111  1.0

基于Pandas的简洁实现

如果更倾向于Pandas风格的代码,可以用apply结合np.outer实现:

import pandas as pd
import numpy as np

df = pd.DataFrame([[4,5],[7,8],[9,10]], columns=['a','b'])

def compute_row_ratios(row):
    # 生成元素外除矩阵并展平为Series
    return pd.Series(
        np.outer(row, 1/row).flatten(),
        index=['a/a', 'a/b', 'b/a', 'b/b']
    )

result = df.apply(compute_row_ratios, axis=1)
print(result)

输出与Numpy方法完全一致。

关键说明

  • Numpy方法的核心是广播机制,避免了Python层面的循环,在数据量较大时性能优势明显
  • 列名顺序对应你要求的矩阵展开顺序:先第一行的a/a、a/b,再第二行的b/a、b/b

内容的提问来源于stack exchange,提问作者cjm2671

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 00:31:06