# 找出 example_usage 中未匹配上的行 merged = example_usage.merge( example_myexample_usage[id_list], on=id_list, how='left', indicator=True ) example_not_data = merged[merged['_merge'] == 'left_only'][example_usage.columns] # 找出 myexample_usage 中未匹配上的行 merged_my = myexample_usage.merge( example_myexample_usage[id_list], on=id_list, how='left', indicator=True ) myexample_not_data = merged_my[merged_my['_merge'] == 'left_only'][myexample_usage.columns]帮我详细解释一下
时间: 2025-09-03 12:15:41 AIGC 浏览: 4
当然可以,下面我将 **逐行详细解释这段代码** 的含义和作用。
---
## 🎯 目标
你有两个 DataFrame:
- `example_usage`:主表 A
- `myexample_usage`:主表 B
你已经通过 `id_list`(比如 `['id', 'date']`)进行了 **inner join**,得到了 `example_myexample_usage`,即两个表中 **都匹配上的数据**。
现在你想分别找出:
- `example_usage` 中 **没有匹配上** 的行
- `myexample_usage` 中 **没有匹配上** 的行
---
## 🧠 解决思路
### ✅ 方法:使用 `merge(..., how='left', indicator=True)`
通过 **左连接(left join)** 将原表与“已匹配的表”进行连接,并使用 `indicator=True` 来标记每行的来源。
这样你就可以通过 `_merge` 列判断哪些行是只存在于原表但未匹配上的。
---
## 📌 第一步:找出 `example_usage` 中未匹配上的行
```python
merged = example_usage.merge(
example_myexample_usage[id_list],
on=id_list,
how='left',
indicator=True
)
example_not_data = merged[merged['_merge'] == 'left_only'][example_usage.columns]
```
### 🔍 逐行解释:
#### 1. `example_myexample_usage[id_list]`
- 从 `example_myexample_usage` 中只取 `id_list` 指定的列(如 `['id', 'date']`)。
- 这些列是复合键,用于判断是否在 `example_usage` 中存在匹配。
#### 2. `merge(..., on=id_list, how='left')`
- 将 `example_usage` 与 `example_myexample_usage[id_list]` 进行左连接。
- 左连接意味着:保留 `example_usage` 中的所有行。
- 如果某行在 `example_myexample_usage` 中找不到匹配的复合键,则相关列为 `NaN`。
#### 3. `indicator=True`
- 添加一列 `_merge`,它的值可以是:
- `'both'`:该行在左右两个表中都有匹配
- `'left_only'`:该行只在左表(`example_usage`)中存在,未在右表中匹配到
#### 4. `merged['_merge'] == 'left_only'`
- 筛选出那些在 `example_usage` 中存在,但在 `example_myexample_usage` 中 **没有匹配上的行**。
#### 5. `[example_usage.columns]`
- 最后只保留 `example_usage` 的原始列,去掉 `_merge` 和其他无关列。
---
## 📌 第二步:找出 `myexample_usage` 中未匹配上的行
```python
merged_my = myexample_usage.merge(
example_myexample_usage[id_list],
on=id_list,
how='left',
indicator=True
)
myexample_not_data = merged_my[merged_my['_merge'] == 'left_only'][myexample_usage.columns]
```
### 🔍 逐行解释:
这一段逻辑与上面完全一致,只是将对象换成了 `myexample_usage`:
- 用 `myexample_usage` 去和 `example_myexample_usage[id_list]` 做左连接
- 筛选出 `_merge == 'left_only'` 的行
- 保留 `myexample_usage` 的原始列
---
## ✅ 总结对比
| 步骤 | 说明 | 使用的技术 |
|------|------|-------------|
| 找出 `example_usage` 中未匹配的行 | 使用左连接 + `_merge == 'left_only'` | `merge(..., how='left', indicator=True)` |
| 找出 `myexample_usage` 中未匹配的行 | 同上,换一个主表 | 同上 |
---
## 🧪 示例说明
假设:
```python
example_usage = pd.DataFrame({
'id': [1, 2, 3, 4],
'date': ['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04'],
'value1': [10, 20, 30, 40]
})
myexample_usage = pd.DataFrame({
'id': [1, 2, 5, 6],
'date': ['2024-01-01', '2024-01-02', '2024-01-05', '2024-01-06'],
'value2': [100, 200, 500, 600]
})
id_list = ['id', 'date']
```
运行后:
- `example_usage` 中未匹配上的行是:
```python
id=1, date=2024-01-01 → 匹配上
id=2, date=2024-01-02 → 匹配上
id=3, date=2024-01-03 → 未匹配上
id=4, date=2024-01-04 → 未匹配上
```
- `myexample_usage` 中未匹配上的行是:
```python
id=5, date=2024-01-05 → 未匹配上
id=6, date=2024-01-06 → 未匹配上
```
---
## ✅ 推荐写法封装成函数(可选)
你可以将这个逻辑封装成函数,方便复用:
```python
def get_unmatched_rows(left_df, matched_df, key_columns):
merged = left_df.merge(
matched_df[key_columns],
on=key_columns,
how='left',
indicator=True
)
return merged[merged['_merge'] == 'left_only'][left_df.columns]
```
调用方式:
```python
example_not_data = get_unmatched_rows(example_usage, example_myexample_usage, id_list)
myexample_not_data = get_unmatched_rows(myexample_usage, example_myexample_usage, id_list)
```
---
###
阅读全文
相关推荐



















