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

如何用Pandas按用户、日期和交易类型分组统计数量与总成本?

Pandas实现多维度交易数据聚合统计

问题场景

现有如下原始DataFrame:

Date            User    Tradetype  Cost
2022-01-01      User1    Sell       $1
2022-01-01      User1    Buy        $2
2022-01-01      User1    Sell       $0
2022-01-01      User2    Buy        $1
2022-01-01     User2     Sell       $1

需要聚合得到按用户、日期、交易类型分组的交易次数及总金额:

User      Date         Tradetype      Count    TotalCost
User1    2022-01-01     Buy             2       $2
User1    2022-01-01     Sell            2       $2
User2    2022-01-01     Buy             1       $1
User2    2022-01-01     Sell            1       $1

解决方案

核心是按User、Date、Tradetype三个维度分组,同时完成交易次数计数和金额求和,步骤如下:

  1. 清洗金额列:先去掉$符号,转为数值类型才能进行求和运算
  2. 多维度分组聚合:用groupby指定三个分组字段,同时统计行数和金额总和
  3. 格式化金额输出:给求和后的总金额重新加上$符号
  4. 调整结果结构:重置索引并匹配目标输出的列顺序

完整代码

import pandas as pd

# 构造原始DataFrame
data = {
    'Date': ['2022-01-01', '2022-01-01', '2022-01-01', '2022-01-01', '2022-01-01'],
    'User': ['User1', 'User1', 'User1', 'User2', 'User2'],
    'Tradetype': ['Sell', 'Buy', 'Sell', 'Buy', 'Sell'],
    'Cost': ['$1', '$2', '$0', '$1', '$1']
}
df = pd.DataFrame(data)

# 1. 清洗Cost列,转为数值类型
df['Cost'] = df['Cost'].str.replace('$', '', regex=False).astype(float)

# 2. 多列分组,同时统计交易次数和总金额
agg_result = df.groupby(['User', 'Date', 'Tradetype']).agg(
    Count=('Cost', 'size'),  # size统计每组行数,即交易次数
    TotalCost=('Cost', 'sum') # sum计算每组金额总和
).reset_index()

# 3. 给TotalCost加回$符号,匹配目标格式
agg_result['TotalCost'] = '$' + agg_result['TotalCost'].astype(str)

# 4. 调整列顺序(可选,完全匹配目标输出结构)
agg_result = agg_result[['User', 'Date', 'Tradetype', 'Count', 'TotalCost']]

print(agg_result)

关键说明

  • groupby(['User', 'Date', 'Tradetype']):同时按三个字段分组,确保每个用户在指定日期下的每种交易类型单独统计,避免维度遗漏
  • agg()方法支持一次性定义多个聚合规则,size用于统计交易次数,sum用于计算金额总和
  • 若不需要保留$格式,可直接省略金额格式化步骤

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 14:52:02