如何基于时间索引对Pandas DataFrame进行行减法运算?
问题与解决方案
问题说明
原始DataFrame:
time code amount 2023-01 A 100000 2023-01 B 200000 2023-02 A 150000 2023-02 B 100000
需求:按code分组,计算后一期(2023-02)amount减去前一期(2023-01)amount的结果,输出格式如下:
code amount A 50000 B -100000
解决方案
方法一:分组计算相邻差值(通用多期场景)
适合时间序列包含多个连续期数的情况,自动计算每组内相邻时间的amount差值:
import pandas as pd # 构造原始数据 df = pd.DataFrame({ 'time': ['2023-01', '2023-01', '2023-02', '2023-02'], 'code': ['A', 'B', 'A', 'B'], 'amount': [100000, 200000, 150000, 100000] }) # 按code分组,计算amount的相邻差值,过滤空值后整理格式 result = df.groupby('code')['amount'].diff().dropna() result = result.reset_index(drop=True).to_frame(name='amount') result.insert(0, 'code', df['code'].unique()) print(result)
方法二:宽表转换后直接相减(明确两期场景)
如果仅需计算指定两个时间点的差值,可将数据转为宽表后直接做减法:
import pandas as pd df = pd.DataFrame({ 'time': ['2023-01', '2023-01', '2023-02', '2023-02'], 'code': ['A', 'B', 'A', 'B'], 'amount': [100000, 200000, 150000, 100000] }) # 转换为宽表:code为行索引,time为列,值为amount wide_df = df.pivot(index='code', columns='time', values='amount') # 计算2023-02与2023-01的差值,再转为目标格式 result = (wide_df['2023-02'] - wide_df['2023-01']).reset_index(name='amount') print(result)
两种方法都能得到目标结果,可根据实际数据场景选择。
内容的提问来源于stack exchange,提问作者Quang Minh Vu
相关产品推荐
相关产品推荐

