Skip to main content
 首页 » 编程设计

python之减去在多个列值上连接的两个 Pandas DataFrames

2025年05月04日10tuyile006

我试图从 DataFrame B 中的一列值中减去 DataFrame A 中一列的值,但前提是多个列值彼此相等。

假设(虚构):

DataFrame A: 
Index    Department  Speciality   TargetMonth Capacity 
1        Sales       Cars         2019-1      150 
2        Sales       Cars         2019-2      120 
3        Sales       Furniture    2019-1      110 
4        IT          Servers      2019-1      100 
 
DataFrame B: 
Index    Department  Speciality   TargetMonth Required 
1        Sales       Cars         2019-1      100 
2        Sales       Cars         2019-2      120 
3        IT          Servers      2019-1      50 
4        Sales       Furniture    2019-1      50 

我故意调换了 DataFrame B 和 A 中索引 3 和 4 的顺序。我的目标是从 DataFrame A 的 Capacity 列中减去 DataFrame B 的 Required 列作为所需的容量小时数,并得到另一个不一定需要排序的列表:

Index    Department  Speciality   TargetMonth Result 
1        Sales       Cars         2019-1      50 
2        Sales       Cars         2019-2      0 
3        Sales       Furniture    2019-1      60 
4        IT          Servers      2019-1      50 

因此,从技术上讲,仅减去,并且仅当所有列值彼此匹配且不基于顺序时,因为一个列表或另一个列表中可能缺少某些行。

我可以用一些 for 循环和条件来解决这个问题,但我想有一个干净整洁的 Pandas 方法可以用 .subtract 解决这个问题,尽管它是我目前卡住的“连接”部分。

提前感谢您抽出时间。

请您参考如下方法:

这就是 Index 如此有用的原因,减法将在索引(行和列)上对齐。

dfA = dfA.set_index(['Department', 'Speciality', 'TargetMonth']) 
dfB = dfB.set_index(['Department', 'Speciality', 'TargetMonth']) 
 
dfA.sub(dfB.rename(columns={'Required': 'Capacity'}), fill_value=0) 
 
                                   Capacity 
Department Speciality TargetMonth           
IT         Servers    2019-1             50 
Sales      Cars       2019-1             50 
                      2019-2              0 
           Furniture  2019-1             60