You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:基于时间戳+货币对汇总金额列生成目标DataFrame的问题

问题:按CCY Pair和Time维度汇总金额列

原始DataFrame结构:

CCY Pair        Time    Amt   
0     EURUSD    13/05/2023  1000    
1     EURUSD    13/05/2023  2000    
2     EURUSD    14/05/2023  3000   
3     EURUSD    14/05/2023  5000    
4     GBPEUR    15/05/2023  4000  

期望得到的目标DataFrame:

CCY Pair        Time    Amt   AmtSum
0     EURUSD    13/05/2023  1000  3000   
1     EURUSD    14/05/2023  3000  8000    
2     GBPEUR    15/05/2023  4000  4000

用户编写的错误代码:

df2= pd.to_datetime(df['Time'])

StartDate = df['Time']
EndDate= StartDate.iloc[::-1]

dfx=df
dfx['StartDate'] = StartDate
dfx['EndDate'] = EndDate

dfx['AmtSum'] = dfx.apply(lambda x: df.loc[(df.Time >= x.StartDate) & 
                                            (df.Time <= x.EndDate), 'Amt'].sum(), axis=1)

错误分析

  1. 时间格式未正确处理:直接用字符串类型的Time做范围比较,会按字符串字典序而非日期逻辑判断,导致范围筛选错误。
  2. 逻辑方向完全偏离:反转Time得到EndDate的操作,不符合「按CCY Pair+Time分组汇总当日金额」的需求逻辑。
  3. 效率低下:apply循环逐行计算的方式,远不如Pandas内置的分组聚合方法高效。

正确实现代码

方法1:分组汇总+合并去重

import pandas as pd

# 构造原始数据(如果已有DataFrame可跳过此步)
data = {
    'CCY Pair': ['EURUSD', 'EURUSD', 'EURUSD', 'EURUSD', 'GBPEUR'],
    'Time': ['13/05/2023', '13/05/2023', '14/05/2023', '14/05/2023', '15/05/2023'],
    'Amt': [1000, 2000, 3000, 5000, 4000]
}
df = pd.DataFrame(data)

# 1. 按CCY Pair和Time分组,计算每组的Amt总和
group_sum = df.groupby(['CCY Pair', 'Time'])['Amt'].sum().reset_index(name='AmtSum')

# 2. 合并回原始数据,保留每组第一行数据
result = df.merge(group_sum, on=['CCY Pair', 'Time']).drop_duplicates(subset=['CCY Pair', 'Time'], keep='first')

# 调整列顺序并重置索引
result = result[['CCY Pair', 'Time', 'Amt', 'AmtSum']].reset_index(drop=True)
print(result)

方法2:transform直接添加汇总列(更简洁)

import pandas as pd

df = pd.DataFrame(data)

# 直接为每个分组添加当日金额总和列
df['AmtSum'] = df.groupby(['CCY Pair', 'Time'])['Amt'].transform('sum')

# 去重并重置索引
result = df.drop_duplicates(subset=['CCY Pair', 'Time'], keep='first').reset_index(drop=True)
print(result)

运行后输出结果:

CCY Pair        Time    Amt  AmtSum
0     EURUSD  13/05/2023  1000    3000
1     EURUSD  14/05/2023  3000    8000
2     GBPEUR  15/05/2023  4000    4000

可选优化:日期排序

如果需要确保结果按日期顺序排列,可先转换时间格式并排序:

df['Time'] = pd.to_datetime(df['Time'], format='%d/%m/%Y')
df = df.sort_values(['CCY Pair', 'Time'])

内容的提问来源于stack exchange,提问作者Tom Pitts

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 17:35:34