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

Pandas分组数据处理:筛选多条目组并计算dsti变化率

实现指定的数据转换需求

这里有一个完整的解决方案来达成你想要的数据转换效果,我会一步步拆解代码逻辑:

import pandas as pd

# 初始化你提供的原始数据集
dat = pd.DataFrame({'id': [1,1,1,2,3,4,5,5], 'period':[1,2,3,1,2,1,2,4], 'dsti':[0.1,0.2,0.5,0.2,0.3,0.3,0.4,0.2]})

# 第一步:过滤掉只有单条记录的用户分组
# 用filter筛选出分组内至少有2条数据的id
filtered_df = dat.groupby('id').filter(lambda g: len(g) >= 2)

# 第二步:为每个符合条件的用户计算dsti变化率
def compute_dsti2(group):
    # 先按period排序,确保是按时间顺序计算(防止原始数据顺序乱了)
    sorted_group = group.sort_values('period').reset_index(drop=True)
    # 计算相邻dsti和period的差值
    dsti_diff = sorted_group['dsti'].diff()
    period_diff = sorted_group['period'].diff()
    # 计算变化率dsti2
    sorted_group['dsti2'] = dsti_diff / period_diff
    # 第一条数据没有前序值,按照你给出的示例用dsti/period填充
    sorted_group.loc[0, 'dsti2'] = sorted_group.loc[0, 'dsti'] / sorted_group.loc[0, 'period']
    # 按照你要的最终输出,只保留每个分组的前n-1条(最后一条没有下一个周期来计算)
    return sorted_group.iloc[:-1]

# 把函数应用到每个分组,合并结果
final_result = filtered_df.groupby('id', group_keys=False).apply(compute_dsti2).reset_index(drop=True)

print(final_result)

运行这段代码后,输出结果如下:

id  period  dsti  dsti2
0   1       1   0.1    0.1
1   1       2   0.2    0.1
2   5       2   0.4   -0.1

逻辑拆解

1. 过滤单条目分组

用groupby().filter()方法快速筛选出有至少2条记录的用户,直接剔除了id=2、3、4这些只有单条数据的分组,完全匹配你的第一个需求。

2. 计算dsti变化率

  • 排序保障:先对每个用户的记录按period升序排列,确保计算时是按时间先后顺序来的,避免原始数据顺序错乱导致计算错误。
  • 差值计算:用diff()方法获取相邻行的dsti和period差值,然后相除得到你要的变化率dsti2。
  • 第一条数据填充:每个用户的第一条记录没有前序数据,按照你给出的示例,我们用dsti/period来填充这条的dsti2。
  • 结果截断:根据你提供的最终输出,我们只保留每个分组的前n-1条记录(因为最后一条记录没有下一个周期可以计算变化率)。

补充说明

如果你希望保留每个用户的所有计算结果(包括最后一条记录的前向变化率),只需要去掉compute_dsti2函数里的iloc[:-1]即可,此时输出会是:

id  period  dsti  dsti2
0   1       1   0.1    0.1
1   1       2   0.2    0.1
2   1       3   0.5    0.3
3   5       2   0.4    NaN
4   5       4   0.2   -0.1

这里id=5的第一条记录dsti2为NaN,是因为没有前序数据,你可以根据需求选择填充方式或者剔除这条。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:57:45