如何将numpy的np.roll与Pandas的GroupBy结合实现DataFrame行循环移位
实现方案
你可以直接在groupby的apply/transform方法中调用np.roll实现分组内的循环移位,具体代码如下:
import pandas as pd import numpy as np # 方案1:apply实现 df['complete_contracts_shift'] = df.groupby(['contracts', 'param_contrct'])['complete_contracts']\ .apply(lambda x: np.roll(x, shift=1)) # 方案2:transform实现,高版本Pandas下性能更优 df['complete_contracts_shift'] = df.groupby(['contracts', 'param_contrct'])['complete_contracts']\ .transform(lambda x: np.roll(x, shift=1))
效果验证示例
假设你有如下测试数据:
| contracts | param_contrct | complete_contracts |
|---|---|---|
| A | X | 1 |
| A | X | 2 |
| A | X | 3 |
| B | Y | 4 |
| B | Y | 5 |
执行上述代码后生成的complete_contracts_shift列结果如下,完全符合需求:
| contracts | param_contrct | complete_contracts | complete_contracts_shift |
|---|---|---|---|
| A | X | 1 | 3 |
| A | X | 2 | 1 |
| A | X | 3 | 2 |
| B | Y | 4 | 5 |
| B | Y | 5 | 4 |
注意事项
- 要确保分组内的行顺序和预期一致,
np.roll是严格按照传入序列的顺序执行移位的,如果行顺序需要调整可以先在分组前执行sort_values排序 np.roll的shift参数设为正整数表示向右移位,设为负整数表示向左移位,可以根据自己的需求灵活调整
内容的提问来源于stack exchange,提问作者Alexis Olivero Aimaretti
相关产品推荐
相关产品推荐

