You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Scala在Apache Spark中计算DataFrame列的Delta值

解决按用户分组计算Usage差值的问题

嗨Rahul,这个需求用Pandas的分组结合移位函数就能完美解决,我给你具体的实现步骤和代码:

1. 先构造你的示例DataFrame

首先我们先把你给出的数据转换成Pandas DataFrame,方便后续操作:

import pandas as pd

data = {
    'C_ID': [1, 2, 1, 2, 1],
    'Month': ['January', 'February', 'March', 'April', 'June'],
    'Usage': [10, 100, 20, 40, 50]
}

df = pd.DataFrame(data)

2. 计算Delta差值

核心思路是按C_ID分组,然后对每个分组内的Usage列使用shift(1)获取前一行的值,用当前行的Usage减去前一行的值,最后把第一行的空值填充为0(因为没有前序数据):

# 按C_ID分组,计算当前Usage与前一行的差值
df['Delta'] = df.groupby('C_ID')['Usage'].apply(lambda x: x - x.shift(1)).fillna(0)

或者更简洁的写法(效果完全一致):

df['Delta'] = df['Usage'] - df.groupby('C_ID')['Usage'].shift(1)
df['Delta'] = df['Delta'].fillna(0)

3. 查看最终结果

运行上述代码后,得到的DataFrame就是你想要的结果:

C_IDMonthUsageDelta
1January100.0
2February1000.0
1March2010.0
2April40-60.0
1June5030.0

简单解释下关键函数

  • groupby('C_ID'):把数据按照用户ID分成独立的组,保证每个用户的差值计算不会互相干扰;
  • shift(1):将每个分组内的Usage数据向下移动一行,这样当前行就能和上一行的数据对齐;
  • fillna(0):因为每个分组的第一行没有前序数据,移位后会得到空值(NaN),我们把这些空值替换成0就符合你的需求了。

内容的提问来源于stack exchange,提问作者Rahul Mukherjee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:09:25