繁体   English   中英

比较两个数据帧,只获取索引和列名不匹配的值

[英]compare two data frames and get only non matching values with index and column names pandas dataframe python

df1-

ID Name  Number
0  AAA    123
1  BBB    456
2  CCC    789

df2-

ID Name  Number
0  AAA    123
1  BBB    456
2  CCC    **963**    <----- Non Matching value

想要比较以上两个数据框 df1 和 df2 想要以下格式的结果:只需要与列名不匹配的值。

expected output:
ID Number                        
2  963   

任何人都可以帮我提供代码我是 pandas 的新手,请帮帮我,非常感谢...

您可以在打开指标的情况下使用.merge()指标过滤结果,如下所示:

df3 = df2.merge(df1, how='left', indicator=True)
df3[df3['_merge'] == 'left_only'][['ID', 'Number']]

结果:

   ID  Number
2   2     963

编辑

如果您有多个列并且不想指定列名来突出显示差异,您可以尝试:

df2[(df1 != df2)].dropna(how='all', axis=1).dropna(how='all', axis=0)

演示

df1

   ID Name  Number1  Number2  Number3
0   0  AAA      123       12     1111
1   1  BBB      456       22     2222
2   2  CCC      789       32     3333


df2

   ID Name  Number1  Number2  Number3
0   0  AAA      123       12     1111
1   1  BBB      456       22     2255
2   2  CCC      963       32     3333


df2[df1 != df2].dropna(how='all', axis=1).dropna(how='all', axis=0)


   Number1  Number3
1      NaN   2255.0
2    963.0      NaN

您可以从 non_NaN 值中看到差异。 ID是左侧的索引。

编辑 2

如果您的数字都是整数并且您不希望 Pandas 将整数显示为浮点类型以及NaN值,您可以使用:

df2[df1 != df2].dropna(how='all', axis=1).dropna(how='all', axis=0).fillna('').astype(str).replace(r'\.0', '', regex=True)


  Number1 Number3
1            2255
2     963        

或者,只需使用:

df2[df1 != df2].dropna(how='all', axis=1).dropna(how='all', axis=0).astype('Int64')


   Number1  Number3
1     <NA>     2255
2      963     <NA>

您可以使用以下

df2[df1.Number != df2.Number][['ID', 'Number']]

您可以从 output 中提取任何您想要的数据,其中包含所有不匹配的详细信息

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM