Skip to main content
 首页 » 编程设计

python之将新列计算为 pandas 数据框中另一个值的增量

2025年05月04日15exmyth

我有这个数据框:

     rank  cost brand city 
0     1     1     a    x 
1     2     2     a    x 
2     3     3     a    x 
3     4     4     a    x 
4     5     5     a    x 
5     1     2     b    y 
6     2     4     b    y 
7     3     6     b    y 
8     4     8     b    y 
9     5    10     b    y 

我想创建一个新列“delta”,其中包含与某个品牌-城市组合的排名 1 相比的成本差异。

期望的结果:

     rank  cost brand city delta 
0     1     1     a    x     0 
1     2     2     a    x     1 
2     3     3     a    x     2 
3     4     4     a    x     3 
4     5     5     a    x     4 
5     1     2     b    y     0 
6     2     4     b    y     2 
7     3     6     b    y     4 
8     4     8     b    y     6 
9     5    10     b    y     8 

This answer给了我一些提示,但我无法将系列映射到多索引这一事实。

为了节省打字时间,这里有一些代码:

data = {'rank': [1, 2, 3, 4, 5, 1, 2, 3, 4, 5],  
     'cost': [1, 2, 3, 4, 5, 2, 4, 6, 8, 10], 
     'brand': ['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'b'], 
     'city': ['x', 'x', 'x', 'x', 'x', 'y', 'y', 'y', 'y', 'y'], 
     'delta': ['0', '1', '2', '3', '4', '0', '2', '4', '6', '8'] 
     } 

请您参考如下方法:

这是transform + first

df['delta']=df.cost-df.groupby(['brand','city'])['cost'].transform('first') 
df 
Out[291]:  
   rank  cost brand city  delta 
0     1     1     a    x      0 
1     2     2     a    x      1 
2     3     3     a    x      2 
3     4     4     a    x      3 
4     5     5     a    x      4 
5     1     2     b    y      0 
6     2     4     b    y      2 
7     3     6     b    y      4 
8     4     8     b    y      6 
9     5    10     b    y      8