我相信您需要:
#cross join between both DataFrames
df = df2.assign(A=1).merge(df1.assign(A=1),on='A',suffixes=('','_')).drop('A',axis=1)
#join ID columns and set index
df.index = df.pop('ID_').astype(str) + '_' + df.pop('ID').astype(str)
df.index.name='ID'
print (df)
Hair Legs Feathers Hair_ Legs_ Feathers_
ID
1_21 1 2 0 1 0 0
2_21 1 2 0 1 2 1
3_21 1 2 0 0 2 1
1_22 1 0 1 1 0 0
2_22 1 0 1 1 2 1
3_22 1 0 1 0 2 1
cols = df.filter(regex='_$').columns
#compare rows for match and count True values by sum
df['count'] = df[cols.str[:-1]].eq(df[cols].rename(columns=lambda x: x[:-1])).sum(axis=1)
df = df.drop(cols,axis=1).reset_index()
print (df)
ID Hair Legs Feathers count
0 1_21 1 2 0 2
1 2_21 1 2 0 2
2 3_21 1 2 0 1
3 1_22 1 0 1 2
4 2_22 1 0 1 2
5 3_22 1 0 1 1