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 或一个,如下所示:
生成的新数据必须将df_F的值与df_C的值进行比较,同时考虑以下因素:
真表
df_C与df_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 它更高效和优雅。
谢谢你。
broadcasting和np.select广播并将 in 中的值df_C与 from 中的值df_F相乘,得到的乘积矩阵的形状为(3, 7, 5),然后测试乘积矩阵中的值为正、负或零的条件并分配相应的值1,0以及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)