首页 > 解决方案 > 我如何寻求同时比较不同数据框中的两列?

问题描述

我有两个数据框,我试图比较两列(Cat1 和 Cat2),并且 Cat1 和 Cat2 相同,我想对 Prc 列中的值求和

因此,在下面的示例中,满足条件的唯一两行是 df[0] 的第 0 行和第 4 行,它们满足 df[1] 的第 1 行和第 4 行,因此在这种情况下,df 的总和为 200 [0] 和 185 用于 df[1]

df[0]
  Cat1 Cat2 Cat3 Prc
0  11   0    5   100
1  22   2    9   150
2  33   1    8    50
3  44   2    6   200
4  55   1    8   100

df[1]
  Cat1 Cat2 Cat3 Prc
0  66   1    6   120
1  11   0    5    90
2  44   1    6   185
3  77   2    7   145
4  55   1    5    95   

我可以使用 .isin 比较 df[0][ 与 df[1] 中的 Cat1,但如果这就是我所做的一切,那么即使 Cat2 在 df[0] 中不同,我也会选择 df[0] 中的第 3 行d[1]

我如何寻求同时比较不同数据框中的两列?

这些是 500,000 行 x 32 列的大型数据框,所以我想避免创建新的数据框或新列。

标签: pythonpandas

解决方案


一种想法是DataFrame.merge用于多个列的交集,使用Prcand过滤列sum

df1 = df[0].merge(df[1], on=['Cat1','Cat2'], suffixes=('_0','_1'))
print (df1)
   Cat1  Cat2  Cat3_0  Prc_0  Cat3_1  Prc_1
0    11     0       5    100       5     90
1    55     1       8    100       5     95

print (df1.filter(like='Prc').sum())
Prc_0    200
Prc_1    185
dtype: int64

另一个想法是MultiIndex通过列与DataFrame.set_indexIndex.isin过滤相交boolean indexing

s1 = df[0].set_index(['Cat1','Cat2'])['Prc']
s2 = df[1].set_index(['Cat1','Cat2'])['Prc']

print (s1[s1.index.isin(s2.index)].sum())
200
print (s2[s2.index.isin(s1.index)].sum())
185

推荐阅读