python - 将 DataFrame 与多对多合并
问题描述
我有 2 个包含示例的 DataFrame,我想看看 DataFrame 2 中是否存在 DataFrame 1 的示例。
通常我会聚合每个示例的行并简单地合并 DataFrame。不幸的是,合并必须使用“匹配表”完成,该表在键之间具有多对多关系(id_low 与 id_high)。
简化示例
匹配表:
输入数据帧
因此,它们可以像这样匹配:
预期输出:
简化示例(用于 Python)
import pandas as pd
# Dataframe 1 - containing 1 Example
d1 = pd.DataFrame.from_dict({'Example': {0: 'Example 1', 1: 'Example 1', 2: 'Example 1'},
'id_low': {0: 1, 1: 2, 2: 3}})
# DataFrame 2 - containing 1 Example
d2 = pd.DataFrame.from_dict({'Example': {0: 'Example 2', 1: 'Example 2', 2: 'Example 2'},
'id_low': {0: 1, 1: 4, 2: 6}})
# DataFrame 3 - matching table
dm = pd.DataFrame.from_dict({'id_low': {0: 1, 1: 2, 2: 2, 3: 3, 4: 3, 5: 4, 6: 5, 7: 6, 8: 6},
'id_high': {0: 'A',
1: 'B',
2: 'C',
3: 'D',
4: 'E',
5: 'B',
6: 'B',
7: 'E',
8: 'F'}})
如上所示,d1 和 d2 是可匹配的。
预期输出(或类似):
df_output = pd.DataFrame.from_dict({'Example': {0: 'Example 1'}, 'Example_2': {0: 'Example 2'}})
失败的尝试
与匹配的表翻译值聚合然后合并。考虑使用正则表达式和 OR 运算符。
解决方案
国际大学联盟:
d2.merge(dm)
.merge(d1.merge(dm), on='id_high')\
.groupby(['Example_x','Example_y'])['id_high'].agg(list)\
.reset_index()
输出:
Example_x Example_y id_high
0 Example 2 Example 1 [A, B, E]
推荐阅读
- reactjs - 在 azure devops 和 azure app services 上配置管道并部署 React 应用程序
- jmeter - 每次发送的请求数都在变化时编写 Jmeter 脚本
- php - 在特定的 WooCommerce 结帐字段包装器 html 标记中放置一个 span 标签
- javascript - 将帐户传递给 near-js-api 函数调用
- azure - Azure Key Vault 服务是否支持 PKCS#11?
- c - STM32上的SD卡初始化
- java - 将 Jackson 配置为忽略除类字段/成员之外的所有内容
- java - 从java中的结果末尾删除空行
- javascript - 如何动态访问键值对是JS/React
- sql - Postgres 查询以检索所有标志值为 false 的行