Skip to main content
 首页 » 编程设计

python之拆分两行组内给定列的差异

2025年05月04日17zlslch

在 R 中,如果我有数据框:

a <- c(1,1,2,2,3,3,4,4);b <- c(1,0,1,0,1,0,1,0); c <- c(1.5,2.5,30,20,100,150,0.7,0.3)     
df <- data.frame(a,b,c) 
> df 
  a b     c 
1 1 1   1.5 
2 1 0   2.5 
3 2 1  30.0 
4 2 0  20.0 
5 3 1 100.0 
6 3 0 150.0 
7 4 1   0.7 
8 4 0   0.3 

我可以用向量化的方式拆分组内的差异:

df$d <- ifelse(df$b == 1, (df$c - c(df$c[-1], NA)) / 2, (df$c - c(NA, df$c[-nrow(df)])) / 2) 
> df 
  a b     c     d 
1 1 1   1.5  -0.5 
2 1 0   2.5   0.5 
3 2 1  30.0   5.0 
4 2 0  20.0  -5.0 
5 3 1 100.0 -25.0 
6 3 0 150.0  25.0 
7 4 1   0.7   0.2 
8 4 0   0.3  -0.2 

是否有类似的方法可以在 pandas 中使用相同的数据框实现这些结果?

df = pd.DataFrame({'a': [1,1,2,2,3,3,4,4], 'b': [1,0,1,0,1,0,1,0], 'c': [1.5,2.5,30,20,100,150,0.7,0.3]}) 

请您参考如下方法:

假设每组只有 2 行,那么这只是与平均值的差值。我使用 assign 创建数据框的副本并将新列分配给副本。

df.assign(d=df.groupby('a').c.transform('mean').rsub(df.c)) 
 
   a  b      c     d 
0  1  1    1.5  -0.5 
1  1  0    2.5   0.5 
2  2  1   30.0   5.0 
3  2  0   20.0  -5.0 
4  3  1  100.0 -25.0 
5  3  0  150.0  25.0 
6  4  1    0.7   0.2 
7  4  0    0.3  -0.2 

你可以在原地完成同样的事情

df['d'] = df.groupby('a').c.transform('mean').rsub(df.c)