如何比较两个不同数据帧中的两列并计算出现次数

2024-09-29 03:25:04 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑以下两个数据帧:

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”中有四次出现“A”,但在df_2中的“ref”中只有“intB”列中的三个对应项,因此计数为3


Tags: 数据refdfsdghaawexx
3条回答

使用^{}作为df_1中的筛选器,然后按^{}计算值,按^{}添加缺少的值,最后将Series转换为2列Dataframe

df = (df_1.loc[df_1['intB'].isin(df_2['ref']), 'intA']
          .value_counts()
          .reindex(df_1['intA'].unique(), fill_value=0)
          .rename_axis('symbol')
          .reset_index(name='count'))
print (df)
  symbol  count
0      A      3
1      B      1
2      D      2
3      F      0
4      C      0
5      H      1
6      X      2

创建一个带有isin的布尔掩码,以测试intB列中的元素是否与ref列中的任何元素匹配,然后sum根据intA中的唯一值确定此掩码中的True

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

通过groupby的另一个选项:

result = df_1.assign(count=df_1.intB.isin(df_2.ref)).groupby(
    'intA', sort=False, as_index=False).agg({'count': sum})

输出:

  intA  count
0    A      3
1    B      1
2    D      2
3    F      0
4    C      0
5    H      1
6    X      2

相关问题 更多 >