如何在Pandas中仅对相同Index(Id)行执行shift列差值计算
解决方案:按Id分组后计算组内差值
你现在遇到的问题是全局shift会跨不同Id的行计算差值,想要只在相同Id内计算的话,只需要先按Id列分组,再在每个分组里执行差值计算就可以啦!
具体代码实现
你可以直接用groupby配合diff方法(和你原来的x - x.shift(-1)逻辑完全一致):
df['Difference'] = df.groupby('Id')['A'].diff(-1)
或者如果你更习惯用shift的写法,也可以这样写:
df['Difference'] = df.groupby('Id')['A'].apply(lambda x: x - x.shift(-1))
为什么这样有效?
原来的df['A'].shift(-1)是对整个A列做偏移,完全不考虑Id的分组关系,所以会出现不同Id的行互相相减的情况。而用groupby('Id')之后,Pandas会把数据拆分成多个子DataFrame(每个子DataFrame对应一个唯一的Id),然后在每个子DataFrame内部独立执行diff(-1)或者shift操作,这样就保证了只有相同Id的行才会参与差值计算,每个分组的最后一行因为没有下一行,差值会自动变成NaN,正好符合你想要的效果~
内容的提问来源于stack exchange,提问作者user96564
相关产品推荐
相关产品推荐

