【发布时间】:2017-06-21 07:14:30
【问题描述】:
上一个问题:Pandas Compare two dataframes and determine the matched values
我有两个数据框:
print(a)
ID Value
0 AA12 101 BB101 CC01 DD06 1
1 AA12 101 BB101 CC01 DD06 2
2 AA11 102 BB101 CC01 2341 DD07 2
3 AA10 202 BB101 CC01 3451 DD09 3
4 AA13 103 BB101 CC02 1231 4
5 AA14 203 BB101 CC02 4561 5
print(b)
ID Value
0 AA12 101 BB101 CC01 1351 DD06 1
1 AA12 101 BB101 CC01 1351 DD06 2
2 AA11 102 BB101 CC01 DD07 2
3 AA10 202 BB101 CC01 3451 DD09 3
4 AA13 103 BB101 CC02 4
5 AA14 203 BB101 CC02 4561 6
期望的输出:
ID Value ID Matched? Value Matched?
0 AA12 101 BB101 CC01 DD06 1 Yes Yes
1 AA12 101 BB101 CC01 DD06 2 Yes Yes
2 AA11 102 BB101 CC01 2341 DD07 2 Yes Yes
3 AA10 202 BB101 CC01 3451 DD09 3 Yes Yes
4 AA13 103 BB101 CC02 1231 4 No Yes
5 AA14 203 BB101 CC02 4561 5 Yes No
这是@MaxU 在上一篇文章中编写的代码:
pd.merge(a.assign(x=a.ID.str.split().apply(sorted).str.join(' ')),
b.assign(x=b.ID.str.split().apply(sorted).str.join(' ')),
on=['x','Value'],
how='outer',
indicator=True)
我想要达到的目标:
- 如果任一数据帧不包含来自 ['ID'] 的四位数项目 (即 2341、3451),我想将其从匹配过程中排除。
- 如果相同的 ID 出现多次,它们可以有不同的值 ['价值']。
这段代码的结果是here。不幸的是,它没有达到预期的结果。只有索引 3 匹配。我正在调整代码,但无法弄清楚下一步。
非常感谢您的时间和考虑!
【问题讨论】:
-
整个数据框的 ID 必须没有 4 位数字?或者您只想排除没有 4 位模式的行(例如您的示例中的索引 0 和 1)?
-
如果 a.ID 或 b.ID 不包含 4 位数字,我想从这些行的 ID 中删除它。