如何用Pandas按分钟与Operation计算Count的总和及Delta值?
需求说明
我有如下格式的CSV数据:
| Time | Count | Operation |
|---|---|---|
| 10:01:00 | 2 | Up |
| 10:01:00 | 5 | Down |
| 10:01:00 | 1 | Down |
| 10:01:00 | 2 | Up |
| 10:01:00 | 1 | Up |
| 10:02:00 | 3 | Down |
| 10:02:00 | 2 | Up |
| 10:02:00 | 5 | Down |
需要完成两个步骤:
- 按分钟和Operation对Count列求和,得到结果:
Sum():
| Time | Count | Operation |
|---|---|---|
| 10:01:00 | 5 | Up |
| 10:01:00 | 6 | Down |
| 10:02:00 | 2 | Up |
| 10:02:00 | 8 | Down |
- 对同一分钟的Up和Down求和值做差(Down - Up),得到Delta列:
Diff():
| Time | Delta |
|---|---|
| 10:01:00 | 1 |
| 10:02:00 | 6 |
我尝试了以下代码,但未能达到预期效果:
def Delta_Volume(): df = pd.read_csv(Ex_Csv, usecols=['Time','Count','Operation'], parse_dates=[0]) df['Time'] = df['Time'].dt.floor("T", 0).dt.time df1 = df.groupby('Operation').sum('Count') df2 = df.groupby('Operation').diff('Count') #df['Delt_of_row'] = df.loc[1 : 3,['Count' , 'Operation']].sum(axis = 1) #df['Delt_of_row'] = df.loc[1 : 3,['Count' , 'Operation']].diff(axis = 1) print(df1)
解决方案
你的代码问题在于分组时仅按Operation单字段分组,未同时关联Time,且diff方法的用法不符合需求。以下是正确实现:
完整代码
import pandas as pd def Delta_Volume(Ex_Csv): # 读取CSV并解析时间列,按分钟取整 df = pd.read_csv(Ex_Csv, usecols=['Time','Count','Operation'], parse_dates=['Time']) df['Time'] = df['Time'].dt.floor('T').dt.time # 按时间+操作类型分组求和 sum_df = df.groupby(['Time', 'Operation'], as_index=False)['Count'].sum() print("Sum():") print(sum_df) # 透视表转换格式,计算Delta值 pivot_df = sum_df.pivot(index='Time', columns='Operation', values='Count').fillna(0) pivot_df['Delta'] = pivot_df['Down'] - pivot_df['Up'] delta_df = pivot_df[['Delta']].reset_index() print("\nDiff():") print(delta_df) # 调用示例,替换为你的CSV文件路径 # Delta_Volume("your_data.csv")
关键说明
- 分组求和:使用
groupby(['Time', 'Operation'])同时按时间和操作类型分组,确保同一分钟内的Up/Down分别统计求和,这是实现第一步需求的核心。 - 计算差值:通过
pivot将Operation的Up/Down转为列,直接做减法得到Delta值,fillna(0)用于处理某一分钟仅存在一种操作的边界情况,避免出现NaN。
内容的提问来源于stack exchange,提问作者Show_man
相关产品推荐
相关产品推荐

