如何使用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_ID | Month | Usage | Delta |
|---|---|---|---|
| 1 | January | 10 | 0.0 |
| 2 | February | 100 | 0.0 |
| 1 | March | 20 | 10.0 |
| 2 | April | 40 | -60.0 |
| 1 | June | 50 | 30.0 |
简单解释下关键函数
groupby('C_ID'):把数据按照用户ID分成独立的组,保证每个用户的差值计算不会互相干扰;shift(1):将每个分组内的Usage数据向下移动一行,这样当前行就能和上一行的数据对齐;fillna(0):因为每个分组的第一行没有前序数据,移位后会得到空值(NaN),我们把这些空值替换成0就符合你的需求了。
内容的提问来源于stack exchange,提问作者Rahul Mukherjee
相关产品推荐
相关产品推荐

