[英]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
是左侧的索引。
如果您的数字都是整数并且您不希望 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']]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.