加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-17 17:37:53 所属栏目:Python 来源:网络整理
导读:我有两个数据框 df1ID Hair Legs Feathers 1 1 0 0 2 1 2 1 3 0 2 1 df2ID Hair Legs Feathers21 1 2 022 1 0 1 我想将df2中的每一行与df1中的所有行进行比较,并以这样的方式计算df2的每一行中相似的列数,即得出以下数据帧df3 df3ID Hair Legs Feathers Coun

我有两个数据框

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读