如何用Pandas对比两个序列列并插入元素实现DataFrame序列匹配
两个Pandas序列对齐插空的实现方案
你现有代码的核心问题是遍历原DataFrame的固定索引,过程中修改列长度会导致索引错位,且Pandas的Series拼接逻辑不能用普通列表的
+直接添加单个NaN值,因此无法达到预期效果。
实现思路
采用双指针法遍历两个序列的非空元素,匹配时同步写入两个结果列,不匹配时为滞后序列补空值,最后将结果转为新的DataFrame即可。
完整代码
import pandas as pd import numpy as np # 替换为你的原始DataFrame df = pd.DataFrame({ 'column A': [1,3,5,7], 'column B': [1,2,4,5,8] }) # 提取两列的非空值列表 list_a = df['column A'].dropna().tolist() list_b = df['column B'].dropna().tolist() i = j = 0 res_a, res_b = [], [] # 双指针遍历对齐 while i < len(list_a) and j < len(list_b): if list_a[i] == list_b[j]: res_a.append(list_a[i]) res_b.append(list_b[j]) i += 1 j += 1 elif list_a[i] < list_b[j]: res_a.append(list_a[i]) res_b.append(np.nan) i += 1 else: res_a.append(np.nan) res_b.append(list_b[j]) j += 1 # 处理剩余未遍历的元素 while i < len(list_a): res_a.append(list_a[i]) res_b.append(np.nan) i += 1 while j < len(list_b): res_a.append(np.nan) res_b.append(list_b[j]) j += 1 # 生成最终结果 result_df = pd.DataFrame({ 'column A': res_a, 'column B': res_b })
输出效果(对应测试用例)
| column A | column B |
|---|---|
| 1 | 1 |
| NaN | 2 |
| 3 | NaN |
| NaN | 4 |
| 5 | 5 |
| 7 | NaN |
| NaN | 8 |
如果你的序列无需按数值大小排序,仅按元素出现顺序匹配,修改双指针的判断逻辑即可适配。
内容的提问来源于stack exchange,提问作者Jorge Enrique Gamboa Fuentes
相关产品推荐
相关产品推荐

