You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过df2-df1获取df2中与df1不匹配的行并存储为df3

提取DataFrame差异行的解决方案

没问题,咱们来搞定这个需求——从df2里找出所有和df1对应行不一致的记录,存到df3里。用pandas可以很轻松实现,下面是具体步骤和代码:

核心思路

我们需要逐行对比df2和df1,标记出存在差异的行,再用这个标记过滤df2,就能得到想要的df3。

完整代码示例

import pandas as pd

# 构造你提供的示例数据(实际使用时替换成自己的DataFrame即可)
data1 = {
    'date': ['2022-09-01', '2022-09-02', '2022-09-03', '2022-09-04'],
    'L120_active_cohort_logins': [32679, 32938, 40746, 33979],
    'L120_active_cohort': [195345, 196457, 197586, 198799],
    'percentage_L120_active_cohort_logins': [16.728865, 16.766010, 20.621906, 17.092138]
}
df1 = pd.DataFrame(data1)

data2 = {
    'date': ['2022-09-01', '2022-09-02', '2022-09-03', '2022-09-04'],
    'L120_active_cohort_logins': [32677, 32938, 40746, 33979],
    'L120_active_cohort': [195345, 196457, 197586, 198799],
    'percentage_L120_active_cohort_logins': [16.728864, 16.766010, 20.621906, 17.092138]
}
df2 = pd.DataFrame(data2)

# 关键步骤:找出差异行并生成df3
# 1. 逐单元格比较,标记每行是否存在差异
diff_row_mask = df2.ne(df1).any(axis=1)
# 2. 用标记过滤df2,得到仅包含差异行的df3
df3 = df2[diff_row_mask]

# 输出结果
print(df3)

代码解释

  • df2.ne(df1):生成一个布尔类型的DataFrame,每个单元格的值表示df2和df1对应位置的值是否不相等。
  • .any(axis=1):沿着行的方向检查,只要该行有任意一个单元格不相等,就返回True,最终得到一个标记差异行的Series。
  • df2[diff_row_mask]:用这个标记Series过滤df2,只保留标记为True的行,也就是和df1不一致的行。

额外说明:行顺序不一致的情况

如果你的df1和df2行顺序可能不同(比如不是按date顺序排列),可以先通过date列对齐后再比较:

# 按date列设置索引,对齐两行数据
df1_aligned = df1.set_index('date')
df2_aligned = df2.set_index('date')

# 重复之前的差异检测步骤
diff_row_mask = df2_aligned.ne(df1_aligned).any(axis=1)
df3 = df2_aligned[diff_row_mask].reset_index()

运行代码后,你会得到预期的输出:

date  L120_active_cohort_logins  L120_active_cohort  percentage_L120_active_cohort_logins
0  2022-09-01                      32677              195345                              16.728864

内容的提问来源于stack exchange,提问作者vaibhav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 14:37:31