根据两个其他数据框的单元格内容创建Pandas数据框

3

我有两个行列数相同的数据框。我想要根据这两个数据框创建一个第三个数据框,使其与另外两个数据框具有相同的维度。第三个数据框中的每个单元格应该是对于df1和df2中相应单元格值应用函数所得的结果。

例如,如果我有:

df1 = | 1 | 2 |
      | 3 | 4 |

df2 = | 5 | 6 |
      | 7 | 8 |

那么 df3 应该是这样的

df3 = | func(1, 5) | func(2, 6) |
      | func(3, 7) | func(4, 8) |

我有一种方法可以做到这一点,但我认为它不是非常Pythonic,也不适用于大型数据框,我想知道是否有一种有效的方法来做这样的事情?

我希望应用的函数是:

def smape3(y, yhat, axis=0):
    all_zeros = not (np.any(y) and np.any(yhat))
    if all_zeros:
        return 0.0
    return np.sum(np.abs(yhat - y), axis) / np.sum(np.abs(yhat + y), axis)

它可以用于生成单个标量值或值数组。在我的使用案例中,函数的输入将是两个标量值。所以smape(1, 5) = 0.66。


1
我肯定我已经编辑了我的帖子。 - Aesir
这个函数和这些数据的预期输出是什么? - Scott Boston
标量值。所以我想问题真正的原因是我有两个二维数组,我想逐元素地应用一个函数来生成第三个二维数组。 - Aesir
例如,调用smape(1, 5)的目的是什么?为什么它在接受两个整数时还有一个轴参数? - timgeb
在这种情况下,它将产生一个标量值。 - Aesir
1个回答

2
您可以采用矢量化方法:
df1 = pd.DataFrame([[1, 2], [3, 4]])
df2 = pd.DataFrame([[5, 6], [7, 8]])

arr = np.where(df1.eq(0) & df2.eq(0), 0, (df2 - df1).abs() / (df2 + df1).abs())

df = pd.DataFrame(arr)

print(df)

          0         1
0  0.666667  0.500000
1  0.400000  0.333333

如果你想将一些逻辑分离到一个函数中:

def smape3(df1, df2):
    return (df2 - df1).abs() / (df2 + df1).abs()

df = pd.DataFrame(np.where(df1.eq(0) & df2.eq(0), 0, smape3(df1, df2)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接