求助:基于时间戳+货币对汇总金额列生成目标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)
错误分析
- 时间格式未正确处理:直接用字符串类型的
Time做范围比较,会按字符串字典序而非日期逻辑判断,导致范围筛选错误。 - 逻辑方向完全偏离:反转
Time得到EndDate的操作,不符合「按CCY Pair+Time分组汇总当日金额」的需求逻辑。 - 效率低下:
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
相关产品推荐
相关产品推荐

