我有两个数据框
>> df1
ID Hair Legs Feathers
1 1 0 0
2 1 2 1
3 0 2 1
>> df2
ID Hair Legs Feathers
21 1 2 0
22 1 0 1
我想将df2中的每一行与df1中的所有行进行比较,并以这样的方式计算df2的每一行中相似的列数,即得出以下数据帧df3
>> df3
ID Hair Legs Feathers Count
1-21 1 2 0 2
2-21 1 2 0 2
3-12 1 2 0 1
1-22 1 0 1 2
2-22 1 0 1 2
3-22 1 0 1 1
计算Count的方式是将df2的第一行与df1的第一行进行比较,并计算相似列的数量.类似地,在df2的第一行与df1的第二行之间,依此类推.此外,将第二行df2与df1的所有行一一比较,并存储在另一个数据帧df3中.
任何帮助将不胜感激
最佳答案
我相信您需要:
#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