如何对比两个同索引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 < df2df1[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数值 |
|---|---|---|---|
| x | A | 1 | 2 |
| x | B | 2 | 3 |
| y | B | 4 | 5 |
| z | A | 5 | 6 |
完美符合需求~
内容的提问来源于stack exchange,提问作者Namit Mohale
相关产品推荐
相关产品推荐

