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

如何对比两个同索引DataFrame,提取df1<df2的结果至新DataFrame

嘿,这个需求其实挺常见的,用Pandas分分钟就能搞定~我给你两种常用的方案,你可以根据自己的实际需求选:

方案1:保留原DataFrame的结构,仅保留满足df1 < df2的值

如果想让新的DataFrame和原数据的行列结构保持一致,不满足条件的位置用NaN填充,直接用where()方法就可以:

import pandas as pd

# 假设df1和df2是已经存在的同索引DataFrame
df_new = df1.where(df1 < df2)

解释:

  • df1.where(条件)会遍历每个元素,当满足df1 < df2时保留df1的原值,不满足的替换成NaN
  • 最终的df_new和df1、df2拥有完全相同的索引和列名,只保留符合要求的数值

方案2:提取所有满足条件的元素,整理成长格式表格

如果想把所有符合df1 < df2的元素单独拎出来,做成包含索引、列名、df1数值、df2数值的清晰表格,可以这么写:

# 第一步:生成布尔掩码,标记哪些位置满足df1 < df2
mask = df1 < df2

# 第二步:提取df1中符合条件的值,转成长格式并重置索引
df_new = df1[mask].stack().reset_index()
# 重命名列名,让表格更直观
df_new.columns = ['索引', '列名', 'df1数值']

# 可选:如果需要同时显示df2中对应的数值,可以加上这一行
df_new['df2数值'] = df2[mask].stack().values

解释:

  • mask是一个和原DataFrame同结构的布尔矩阵,True表示对应位置满足df1 < df2
  • df1[mask]会把不满足条件的位置设为NaN,stack()把二维表格转成一维的Series(行索引+列名作为多级索引)
  • reset_index()把多级索引转成普通列,最后我们可以给列起更易懂的名字,还能追加df2的对应数值

举个小例子验证下:
假设df1和df2是这样的:

df1 = pd.DataFrame({'A': [1, 3, 5], 'B': [2, 4, 6]}, index=['x', 'y', 'z'])
df2 = pd.DataFrame({'A': [2, 2, 6], 'B': [3, 5, 5]}, index=['x', 'y', 'z'])

用方案2得到的df_new就是:

索引列名df1数值df2数值
xA12
xB23
yB45
zA56

完美符合需求~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:18:02