比较2个数据框中的行并计算相似列的数量

时间:2019-02-20 06:34:27

标签: python pandas dataframe

我有两个数据框

>> 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中。

任何帮助将不胜感激

1 个答案:

答案 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