gpt4 book ai didi

python - pandas.DataFrame 上的成对行操作矩阵

转载 作者:太空宇宙 更新时间:2023-11-03 14:34:18 27 4
gpt4 key购买 nike

我想创建一个 DataFrame 中所有行对的运算结果矩阵。

这是我想要的示例:

df = pandas.DataFrame({'val':  [ 2,    3,    5,    7  ],
'foo': ['f1', 'f2', 'f3', 'f4']},
index= ['n1', 'n2', 'n3', 'n4'])

def op1(row1, row2):
return row1['val']*row2['val']

def op2(row1, row2):
return f"{row1['foo']}{row2['foo']}"

def apply_op_to_all_row_pairs(df, op):
# what goes in here?

apply_op_to_all_row_pairs(df, op1)
# n1 n2 n3 n4
# n1 4 6 10 14
# n2 6 9 15 21
# n3 10 15 25 35
# n4 14 21 35 49

apply_op_to_all_row_pairs(df, op2)
# n1 n2 n3 n4
# n1 'f1f1' 'f1f2' 'f1f3' 'f1f4'
# n2 'f2f1' 'f2f2' 'f2f3' 'f2f4'
# n3 'f3f1' 'f3f2' 'f3f3' 'f3f4'
# n4 'f4f1' 'f4f2' 'f4f3' 'f4f4'

我已经看到了很多依赖于计算距离矩阵的现有函数的解决方案,但我想要更通用的东西。例如, scipy.spatial.distance.pdist 实现了我想要的格式,但只处理 float ,并且不允许您按名称选择列(或者至少我不知道如何)。

最佳答案

您可以只使用广播的 numpy 操作:

v = df.val.values[:, None] * df.val.values
v

array([[ 4, 6, 10, 14],
[ 6, 9, 15, 21],
[10, 15, 25, 35],
[14, 21, 35, 49]])

x = df.foo.values[:, None] + df.foo.values
x

array([['f1f1', 'f1f2', 'f1f3', 'f1f4'],
['f2f1', 'f2f2', 'f2f3', 'f2f4'],
['f3f1', 'f3f2', 'f3f3', 'f3f4'],
['f4f1', 'f4f2', 'f4f3', 'f4f4']], dtype=object)

转换为数据帧非常简单,只需调用构造函数即可:

pd.DataFrame(x, df.index, df.index)

n1 n2 n3 n4
n1 f1f1 f1f2 f1f3 f1f4
n2 f2f1 f2f2 f2f3 f2f4
n3 f3f1 f3f2 f3f3 f3f4
n4 f4f1 f4f2 f4f3 f4f4

关于python - pandas.DataFrame 上的成对行操作矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47073936/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com