如何按rc_id计算两个DataFrame中impacted_users列的标准差并新增std列
解决方案
实现思路
无需全量拼接两个DataFrame,先对df2按rc_id分组预存每组的impacted_users数据,再与df1关联,针对每个rc_id合并两组数据计算标准差,减少不必要的数据复制,提升效率。
代码实现
import pandas as pd import numpy as np # 对df2按rc_id分组,保存每组的impacted_users列表 df2_grouped = df2.groupby('rc_id')['impacted_users'].agg(list).reset_index(name='df2_values') # 关联df1和df2的分组结果 merged_df = df1.merge(df2_grouped, on='rc_id', how='left') # 计算std列:合并当前行的impacted_users与df2_values,计算样本标准差并保留两位小数 merged_df['std'] = merged_df.apply( lambda row: np.std([row['impacted_users']] + row['df2_values'], ddof=1).round(2), axis=1 ) # 调整列名与时间戳格式,匹配期望输出 merged_df = merged_df.rename(columns={'rc_id': 'id'}) merged_df['timestamp'] = merged_df['timestamp'] + ' 11:00:00' # 提取目标列 result = merged_df[['id', 'timestamp', 'impacted_users', 'std']] print(result)
代码解释
- 分组预存df2数据:通过
groupby将df2中每个rc_id对应的所有impacted_users值转为列表存储,避免后续重复分组计算。 - 关联数据:用
merge将df1与预存的df2分组结果按rc_id匹配,确保每个rc_id能获取到两组关联数据。 - 计算标准差:通过
apply逐行处理,合并df1的单个值与df2的列表数据,使用np.std计算样本标准差(ddof=1)并保留两位小数,与示例结果一致。 - 格式调整:重命名列名、补充时间戳后缀,生成与期望输出一致的结果。
输出结果
id timestamp impacted_users std 0 296 2022-10-29 11:00:00 145 27.21 1 100 2022-10-29 11:00:00 50 117.36
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

