按Sensor分组计算DataFrame新列及转置的实现方案
问题描述
现有一个以Date为索引的DataFrame,数据结构如下:
| Date | Value | Sensor |
|---|---|---|
| 19/08/2021 | 8787 | A |
| 20/08/2021 | 7360 | A |
| 23/08/2021 | 17570 | A |
| 24/08/2021 | 18993 | A |
| 25/08/2021 | 17947 | A |
| 26/08/2021 | 18317 | A |
| 27/08/2021 | 16940 | A |
| 30/08/2021 | 23837 | A |
| 31/08/2021 | 18353 | A |
| 19/08/2021 | 15010 | B |
| 20/08/2021 | 10873 | B |
| 23/08/2021 | 5270 | B |
| 24/08/2021 | 21060 | B |
| 25/08/2021 | 13430 | B |
| 26/08/2021 | 6267 | B |
| 27/08/2021 | 33677 | B |
| 30/08/2021 | 9460 | B |
| 31/08/2021 | 8223 | B |
需要实现以下需求:
- 按
Sensor分组计算新列Calc,计算公式为:当前Value值 ÷ 5天前的Value值 + 5天前的Value值 ÷ 15天前的Value值,无法计算的位置填充NA。 - 计算完成后转置DataFrame,以
Sensor为索引,日期为列名,Calc值为对应单元格内容。
解决方案
1. 预处理:转换日期索引为datetime类型
首先将字符串格式的日期索引转换为datetime类型,确保移位操作按时间逻辑执行:
import pandas as pd # 转换索引为datetime格式 df.index = pd.to_datetime(df.index, format='%d/%m/%Y')
2. 分组计算Calc列
使用groupby按Sensor分组,对每组的Value列执行移位和除法运算,自动处理缺失值填充NA:
# 分组计算Calc列 df['Calc'] = df.groupby('Sensor')['Value'].apply( lambda x: x.div(x.shift(5)) + x.shift(5).div(x.shift(15)) ).reset_index(level=0, drop=True)
注:当前数据中每个传感器的时间跨度仅12天,不存在15天前的记录,因此所有
Calc值会显示为NA;若后续有更长时间序列的数据,即可得到有效计算结果。
3. 转置DataFrame
将结果转换为以Sensor为索引、日期为列的结构:
# 转置得到目标格式 result = df.pivot_table(index='Sensor', columns=df.index, values='Calc')
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

