python - 将不同的数据框合并在一起,但索引可能并不总是相同
问题描述
我有 11 个不同的区域(P01、P02、...、P11),每个区域都有一些由代码标识的设备(INV 1-1、INV 1-2、...、INV 8-4)。问题是设备数量因地区而异,例如,P01 没有代码 INV 6-4,但 P02 有。但它们的值将始终在index
数组中。
我有一个名为的数据框allEquipAllAreas
,它为每个区域的每个 INV 保存浮点值。这是一个例子:
P01-INV-1-1 P01-INV-1-2 P01-INV-1-3 P01-INV-1-4 P11-INV-7-2 P11-INV-7-3 P11-INV-7-4
-0.52 1.89 1.61 1.59 2.02 1.29 -0.89
我创建了一个 for 来遍历所有区域并获取与该区域相关的所有设备,所以我希望最终得到一个heatMapInvdf
如下所示的最终数据帧allEquipAllAreas
(
P01 P02 P03 P04 P05 P06 P07 P08 P09 P10 P11
INV 1-1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
INV 1-2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
INV 1-3 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
... ...
INV 8-2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
INV 8-3 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
INV 8-4 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
我试图合并它们但无法实现我想要的,所以我到目前为止所做的是:
index = ['INV 1-1','INV 1-2','INV 1-3','INV 1-4','INV 2-1','INV 2-2','INV 2-3','INV 2-4',
'INV 3-1','INV 3-2','INV 3-3','INV 3-4','INV 4-1','INV 4-2','INV 4-3','INV 4-4',
'INV 5-1','INV 5-2','INV 5-3','INV 5-4','INV 6-1','INV 6-2','INV 6-3','INV 6-4',
'INV 7-1','INV 7-2','INV 7-3','INV 7-4','INV 8-1','INV 8-2','INV 8-3','INV 8-4']
columns = ['P01','P02','P03','P04','P05','P06','P07','P08','P09','P10','P11']
heatMapInvdf = pd.DataFrame(index=index, columns=columns)
for area in areas:
equipInArea = allEquipAllAreas.loc[:,allEquipAllAreas.columns.str.contains('P'+area+'-')]
equipInArea = equipInArea.reindex(sorted(equipInArea.columns), axis=1).T
equipInArea.index = equipInArea.index.str.replace(r'P'+area+'-', '')
heatMapInvdf.merge(equipInArea,how='inner',right_index=True,left_index=True)
非常感谢任何帮助!
解决方案
您在源 DF 中拥有所需的一切。系统地重塑它
- 转置
- 具有拆分原始列名的多索引的索引
unstack()
得到你想要的结构droplevel()
清理
import io
import numpy as np
df = pd.read_csv(io.StringIO("""P01-INV-1-1 P01-INV-1-2 P01-INV-1-3 P01-INV-1-4 P11-INV-7-2 P11-INV-7-3 P11-INV-7-4
-0.52 1.89 1.61 1.59 2.02 1.29 -0.89"""), sep="\s+")
heatMapInvdf = (
# transpose for primary shape that is wanted
df.T
# index by multi-index which are from columns
.set_index(pd.MultiIndex.from_arrays(np.array([c.split("-", 1) for c in df.columns]).T))
# unstack the P0n part of index
.unstack(0)
# remove transitent level from column index
.droplevel(0, axis=1)
)
P01 | P11 | |
---|---|---|
INV-1-1 | -0.52 | 楠 |
INV-1-2 | 1.89 | 楠 |
INV-1-3 | 1.61 | 楠 |
INV-1-4 | 1.59 | 楠 |
INV-7-2 | 楠 | 2.02 |
INV-7-3 | 楠 | 1.29 |
INV-7-4 | 楠 | -0.89 |
推荐阅读
- javascript - 编译时强制 Typescript 使用箭头函数
- javascript - 通过 Ajax 将 activerecord 对象发送到控制器操作
- sql - 将“替换为”在 R 中用于 SQL 查询
- azure - 如何在 Azure 数据湖中打开 ORC 文件?
- paypal-sandbox - 为什么我没有在 Braintree 的 res 中获得令牌?
- powershell - 从调用命令获取值
- vb.net - 我收到错误:未为“公共重载只读默认属性字符(索引为整数)为字符”的参数“索引”指定参数
- video - 如何解决flutter视频播放器质量不好的问题
- android - 在多种产品风格之间拆分 C++ 文件
- javascript - 如何计算平均成绩