如何通过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
相关产品推荐
相关产品推荐

