连续值与固定值的差值百分比计算及DataFrame新增E、F列需求
解决方案:为DataFrame添加差值百分比新列
先把你提供的数据集整理成可复现的pandas DataFrame,方便后续操作:
import pandas as pd data = { 'A': list(range(14)), 'B': ['2002-01-12 10:00:00', '2002-01-12 11:00:00', '2002-01-12 12:00:00', '2002-01-13 09:00:00', '2002-01-13 11:00:00', '2002-01-13 12:00:00', '2002-01-13 12:00:00', '2002-01-14 10:00:00', '2002-01-14 11:00:00', '2002-01-14 11:00:00', '2002-01-14 12:00:00', '2002-01-16 10:00:00', '2002-01-16 11:00:00', '2002-01-16 12:00:00'], 'C': ['John', 'Africa', 'Mary', 'Billy', 'Mira', 'Hillary', 'Romina', 'George', 'Denzel', 'Michael', 'Bisc', 'Virgin', 'Antonio', 'Sito'], 'D': [19, 15, 30, 5, 6, 50, 50, 30, 12, 12, 25, 16, 10, 5] } df = pd.DataFrame(data) # 把B列转换为datetime类型,方便后续按日期分组操作 df['B'] = pd.to_datetime(df['B'])
针对你提到的计算连续值与固定值之间的差值百分比并添加E、F列的需求,我分两种常见实用场景实现:
场景1:全局固定值+当日基准值
假设:
E列:D列值与全局固定值(比如30)的差值百分比,公式为((D - 固定值)/固定值)*100F列:D列值与当日第一个D值的差值百分比(按B列日期分组取基准)
代码实现
# 定义全局固定值 global_fixed = 30 # 计算E列:与全局固定值的差值百分比,保留两位小数 df['E'] = ((df['D'] - global_fixed) / global_fixed) * 100 df['E'] = df['E'].round(2) # 计算F列:与当日第一个D值的差值百分比 # 提取日期作为分组键 df['date'] = df['B'].dt.date # 取每组第一个D值作为当日基准 daily_base = df.groupby('date')['D'].transform('first') # 计算百分比差值并格式化 df['F'] = ((df['D'] - daily_base) / daily_base) * 100 df['F'] = df['F'].round(2) # 删除临时date列 df.drop('date', axis=1, inplace=True)
最终结果预览
| A | B | C | D | E | F |
|---|---|---|---|---|---|
| 0 | 2002-01-12 10:00:00 | John | 19 | -36.67 | 0.00 |
| 1 | 2002-01-12 11:00:00 | Africa | 15 | -50.00 | -21.05 |
| 2 | 2002-01-12 12:00:00 | Mary | 30 | 0.00 | 57.89 |
| 3 | 2002-01-13 09:00:00 | Billy | 5 | -83.33 | 0.00 |
| 4 | 2002-01-13 11:00:00 | Mira | 6 | -80.00 | 20.00 |
| 5 | 2002-01-13 12:00:00 | Hillary | 50 | 66.67 | 900.00 |
| 6 | 2002-01-13 12:00:00 | Romina | 50 | 66.67 | 900.00 |
| 7 | 2002-01-14 10:00:00 | George | 30 | 0.00 | 0.00 |
| 8 | 2002-01-14 11:00:00 | Denzel | 12 | -60.00 | -60.00 |
| 9 | 2002-01-14 11:00:00 | Michael | 12 | -60.00 | -60.00 |
| 10 | 2002-01-14 12:00:00 | Bisc | 25 | -16.67 | -16.67 |
| 11 | 2002-01-16 10:00:00 | Virgin | 16 | -46.67 | 0.00 |
| 12 | 2002-01-16 11:00:00 | Antonio | 10 | -66.67 | -37.50 |
| 13 | 2002-01-16 12:00:00 | Sito | 5 | -83.33 | -68.75 |
场景2:自定义固定值逻辑
如果你的“固定值”是其他规则(比如D列中位数、列C为特定值时的D值),只需要调整基准值的定义即可。比如以D列中位数作为固定值:
median_fixed = df['D'].median() df['E'] = ((df['D'] - median_fixed) / median_fixed) * 100 df['E'] = df['E'].round(2)
这样就能灵活适配不同的固定值需求啦。
内容的提问来源于stack exchange,提问作者Tie_24
相关产品推荐
相关产品推荐

