如何比较两个不同数据框中的两列并计算出现次数
考虑以下两个数据框:
dic_1 = {'intA': {0: 'A', 1: 'B', 2: 'A', 3: 'D', 4: 'A', 5: 'F', 6: 'C', 7: 'H', 8: 'D', 9: 'X', 10: 'A', 11: 'C', 12: 'X'}, 'intB': {0: 'FG', 1: 'GH', 2: 'SD', 3: 'KJ', 4: 'FG', 5: 'WE', 6: 'NB', 7: 'GH', 8: 'AA', 9: 'ZX', 10: 'QQ', 11: 'OI', 12: 'XX'}}
df_1 = pd.DataFrame(dic_1)
df_1
intA intB
0 A FG
1 B GH
2 A SD
3 D KJ
4 A FG
5 F WE
6 C NB
7 H GH
8 D AA
9 X ZX
10 A QQ
11 C OI
12 X XX
dic_2 = {'ref': {0: 'AA',
1: 'GH',
2: 'CD',
3: 'FG',
4: 'XX',
5: 'TY',
6: 'ZX',
7: 'SD',
8: 'KJ',
9: 'IU'}}
df_2 = pd.DataFrame(dic_2)
df_2
ref
0 AA
1 GH
2 CD
3 FG
4 XX
5 TY
6 ZX
7 SD
8 KJ
9 IU
我想要的是一个看起来像这样的结果数据框:
symbol count
0 A 3
1 B 1
2 D 2
3 F 0
4 C 0
5 H 1
6 X 2
逻辑:对于df_1中'intA'列中的每一项,如果df_1中'intB'列中对应的项存在于df_2中'ref'列中,则计数加1。例如,在 'intA' 中出现了 4 次 'A',但在 df_2 的 'ref' 中只有 'intB' 列中的三个对应项,因此计数为 3。
回答
创建一个布尔掩码isin以测试intB列中的元素是否与列中的任何元素匹配ref,然后此掩码中sum的True值每个唯一值intA
df_1.set_index('intA')['intB'].isin(df_2['ref'])
.sum(level=0).rename_axis('symbol').reset_index(name='count')
symbol count
0 A 3
1 B 1
2 D 2
3 F 0
4 C 0
5 H 1
6 X 2