使用 shift 和 groupby 计算

calculation using shift and groupby

我想计算一个新列“变化”。
新列的值应按如下方式计算:
X / Z(上方一个单元格) --> 第一行将是空的。
--> 第二行是 1 / 6 = 0,16
-> 第二行是 5 / 10 = 0,5 ...等等..

df = pd.DataFrame({'id': ['a', 'a', 'a', 'b', 'b','b'],
                    'Z': [6,10,8, 6, 6,15],
                     'X': [2,1,5, 2, 3,20]})
var =  df.columns[1]

在论坛中我发现了这个:
df['change'] = df['X'] / df[var].shift(1) 它工作正常。但是我需要插入一个“groupby”参数并且无法让它工作。 我试过这个:
df['change'] = df.groupby('id').apply(lambda x: x['X'] / x[var].shift(1))
但是我得到一个错误:
“插入列的索引与框架索引不兼容”

恐怕我还没有完全理解这个lambda函数。 任何想法如何做到这一点? 提前致谢!

您可以将 X 列按移位的组划分:

df["change"] = df["X"] / df.groupby("id")["Z"].shift(1)
print(df)

打印:

  id   Z   X    change
0  a   6   2       NaN
1  a  10   1  0.166667
2  a   8   5  0.500000
3  b   6   2       NaN
4  b   6   3  0.500000
5  b  15  20  3.333333