我有两个数据框
>> 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
中。
任何帮助将不胜感激
答案 0 :(得分:2)
我相信您需要:
#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