基于Pandas对比两个DataFrame生成3D矩阵的实现方案 [Python]
Pandas 实现两个DataFrame交叉生成3D同号判断矩阵
直接用numpy广播机制就能高效完成计算,完全避免循环,代码简洁性能也更好:
import pandas as pd import numpy as np # 你的原始数据 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']) 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],[1,1,-1,1,-1]], columns=['F1','F2','F3','F4','F5']) # 扩展维度适配广播,得到形状为「样本数 × df_C列数 × df_F列数」的3D结构 arr_C = df_C.values[..., np.newaxis] arr_F = df_F.values[:, np.newaxis, :] # 按规则计算结果 result = np.where(arr_C * arr_F > 0, 1, 0) # 处理含0的位置赋值为NaN mask = (arr_C == 0) | (arr_F == 0) result = result.astype(np.float64) result[mask] = np.nan
得到的result就是你需要的3D矩阵,维度对应关系:
- 第0维:和两个DataFrame的行索引一一对应,共7个元素
- 第1维:对应
df_C的列(C1/C2/C3),共3个元素 - 第2维:对应
df_F的列(F1/F2/F3/F4/F5),共5个元素
比如要取第0行样本、C1列、F1列的计算结果,访问result[0,0,0]即可,样例数据下该值为1,完全符合给定规则。如果需要保留列标签方便后续处理,可以用xarray对结果做包装。
内容的提问来源于stack exchange,提问作者Federica F.
相关产品推荐
相关产品推荐

