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
相关产品推荐
相关产品推荐

