使用 Pandas 生成 3D“矩阵”,基于比较两个数据帧 [Python]

Fed*_* F. 5 python numpy python-3.x pandas

大家,早安。我正在使用 Python 和 Pandas。

我有两个数据帧,类型如下:

df_C = pd.DataFrame(data=[[-3,-1,-1], [5,3,3], [3,3,1], [-1,-1,-3], [-3,-1,-1], [2,3,1], [1,1,1]], columns=['C1','C2','C3'])

   C1  C2  C3
0  -3  -1  -1
1   5   3   3
2   3   3   1
3  -1  -1  -3
4  -3  -1  -1
5   2   3   1
6   1   1   1


df_F = pd.DataFrame(data=[[-1,1,-1,-1,-1],[1,1,1,1,1],[1,1,1,-1,1],[1,-1,-1,-1,1],[-1,0,0,-1,-1],[1,1,1,-1,0],[1,1,-1,1,-1]], columns=['F1','F2','F3','F4','F5'])

   F1  F2  F3  F4  F5
0  -1   1  -1  -1  -1
1   1   1   1   1   1
2   1   1   1  -1   1
3   1  -1  -1  -1   1
4  -1   0   0  -1  -1
5   1   1   1  -1   0
6   1   1  -1   1  -1
Run Code Online (Sandbox Code Playgroud)

我希望能够“交叉”这两个数据帧,以生成 3D 或一个,如下所示:

矩阵3D

生成的新数据必须将df_F的值与df_C的值进行比较,同时考虑以下因素:

  • 如果两个值都为正,则生成 1
  • 如果两个值都是负数,则生成 1
  • 如果一个值为正,另一个为负,则生成 0
  • 如果任何值为零,则生成 None (NaN)

真表

df_Cdf_F数据对比

df_C vs df_F = 3D
  +       +     1
  +       -     0
  +       0     None
  -       +     0
  -       -     1
  -       0     None
  0       +     None
  0       -     None
  0       0     None
Run Code Online (Sandbox Code Playgroud)

你是编程专家,请指导我,当我生成这个矩阵时,我比较了这些值。我想用熊猫来做。我已经用循环 (for) 和条件 (if) 完成了它,但它在视觉上令人不快,我认为使用 Pandas 它更高效和优雅。

谢谢你。

Shu*_*rma 3

麻木broadcastingnp.select

广播并将 in 中的值df_C与 from 中的值df_F相乘,得到的乘积矩阵的形状为(3, 7, 5),然后测试乘积矩阵中的值为正、负或零的条件并分配相应的值10以及NaN当条件成立时

a = df_C.values.T[:, :, None] * df_F.values
a = np.select([a > 0, a < 0], [1, 0], np.nan)
Run Code Online (Sandbox Code Playgroud)
array([[[ 1.,  0.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  0.,  1.],
        [ 0.,  1.,  1.,  1.,  0.],
        [ 1., nan, nan,  1.,  1.],
        [ 1.,  1.,  1.,  0., nan],
        [ 1.,  1.,  0.,  1.,  0.]],

       [[ 1.,  0.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  0.,  1.],
        [ 0.,  1.,  1.,  1.,  0.],
        [ 1., nan, nan,  1.,  1.],
        [ 1.,  1.,  1.,  0., nan],
        [ 1.,  1.,  0.,  1.,  0.]],

       [[ 1.,  0.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  0.,  1.],
        [ 0.,  1.,  1.,  1.,  0.],
        [ 1., nan, nan,  1.,  1.],
        [ 1.,  1.,  1.,  0., nan],
        [ 1.,  1.,  0.,  1.,  0.]]])
Run Code Online (Sandbox Code Playgroud)