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

时间:2018-11-15 21:09:18

标签: python pandas dataframe

我有wo数据框,它们具有相同数量的行和列。我想基于这两个数据框创建第三个数据框,其尺寸与其他两个数据框相同。第三个数据帧中的每个单元格应该是分别应用于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) |

我有办法做到这一点,我认为这不是Python风格的,也不适合大型数据框,并且想知道是否有一种有效的方法来做到这一点?

我想应用的功能是:

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 个答案:

答案 0 :(得分:1)

您可以使用矢量化方法:

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)))