python - 根据索引和列之间的匹配,有选择地将数据帧的元素相乘以获取数字
问题描述
假设我们有一个维度为 nxn 的数据帧 df,具有两个不同的索引级别,行和列相同。我需要根据行索引和列索引之间的匹配,选择性地乘以 df 的某些元素。
这里有一个例子来澄清这个问题:
df = pd.DataFrame(np.ones((5,5)), index=[['A','A','B','B','C'], [1,2,1,2,1]], columns=[['A','A','B','B','C'], [1,2,1,2,1]])
现在我想以这种方式将 df 中的元素相乘:
如果索引和列都相同,则将相关元素乘以 1(例如 A1 和 A1);
如果外部索引等于外部列但内部索引不同于内部列,则将相关元素乘以 2(例如 A1 和 A2);
如果外部索引不同于外部列但内部索引等于内部列,则将相关元素乘以 3(例如 B1 和 A1);
如果外部索引与外部列不同且内部索引与内部列不同,则将相关元素乘以 4(例如 A2 和 C1);
预期输出应该是包含以下元素的数据框:
A A B B C
1 2 1 2 1
A 1 1 2 3 4 3
A 2 2 1 4 3 4
B 1 3 4 1 2 3
B 2 4 3 2 1 4
C 1 3 4 3 4 1
解决方案
这是相当手动的,但会:
offsets = [i + (df.columns.get_level_values(i).values[:,None] != df.index.get_level_values(i).values)
for i in range(2)]
# output:
df.mul(offsets[0]*2 + offsets[1])
输出:
A B C
1 2 1 2 1
A 1 1.0 2.0 3.0 4.0 3.0
2 2.0 1.0 4.0 3.0 4.0
B 1 3.0 4.0 1.0 2.0 3.0
2 4.0 3.0 2.0 1.0 4.0
C 1 3.0 4.0 3.0 4.0 1.0
推荐阅读
- javascript - 从对象数组中为对象的道具添加值
- mongodb - AWS Lambda 和 mongo 中的任务超时错误
- clair - 在 POST /v1/layers 请求时使用 clair,得到 400 响应错误:'找不到图层'
- django - 如何覆盖 django 注册视图类
- mysql - 可以使用nodejs'mysql'模块将角度7连接到mysql
- android - 在 Windows 环境中执行“amplify init”命令时出现 AWS CLI (Amplify) 错误(对于 android studio 项目)
- string - 如何使用批处理搜索 .txt 文件中的特定短语
- java - 如何将移动球的速度设置为一系列速度(Java)
- three.js - 使用 OffscreenCanvas 的 A 帧场景
- python - 找不到python烧瓶404