Skip to main content
 首页 » 编程设计

python之通过另一个数据框中的匹配索引划分数据框列

2025年05月04日15zengkefu

我有一个这样的数据框:

        id1     name    id2   val  
0       1        'A'     1     4 
1       1        'B'     1     1 
2       2        'C'     3     1 
.  
. 
. 

我有另一个数据框如下:

              new_val  
  1              2  
  3              4  

我想制作第一个数据框如下:

        id1     name    id2   val  
0       1        'A'     1     2.0 
1       1        'B'     1     0.5 
2       2        'C'     3     0.25 
.  
. 
. 

我想要做的是将第一个数据框中的 val 列除以与 id2 列索引匹配的值。我们看到 id2 = 1 然后我们将 val = 4 除以 2,因为它对应于索引 1。id2 = 3 然后我们将 val = 1 除以 4 得到 0.25。

我知道我可以将它们添加到元组列表中并执行计算并重置该列,但这可以用 pandas 函数实现吗?对非常大的数据集使用 for 循环在计算上确实非常昂贵。

请您参考如下方法:

嗯,这种方式的空间效率可能较低,但它应该比循环更快:

>>> df1 
   id1 name  id2  val 
0    1  'A'    1    4 
1    1  'B'    1    1 
2    2  'C'    3    1 
>>> df2 = pd.DataFrame([2,4], index=[1,3]) 
>>> df2 
   0 
1  2 
3  4 

所以,从设置索引开始:

>>> df1.set_index('id2', inplace=True) 

然后,使用我认为正确索引的 df2:

>>> df1['divisor'] = df2 
>>> df1 
     id1 name  val  divisor 
id2 
1      1  'A'    4        2 
1      1  'B'    1        2 
3      2  'C'    1        4 
>>> df1.val / df1.divisor 
id2 
1    2.00 
1    0.50 
3    0.25 
dtype: float64 

最后,为了完整起见:

>>> df1['val'] = df1.val / df1.divisor 
>>> df1 
     id1 name   val  divisor 
id2 
1      1  'A'  2.00        2 
1      1  'B'  0.50        2 
3      2  'C'  0.25        4 
>>> df1.drop('divisor',inplace=True, axis=1) 
>>> df1 
     id1 name   val 
id2 
1      1  'A'  2.00 
1      1  'B'  0.50 
3      2  'C'  0.25