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

如何简洁实现Pandas DataFrame重采样并生成多列value_counts与count的合并时间序列

问题:如何简洁合并Pandas重采样后的多维度统计结果?

你现在的需求是把按日重采样后的客户总数、性别分类计数、年龄组分类计数合并到同一个DataFrame里,目前用多次merge的方式确实有点繁琐,这里给你几个更优雅的实现方法,后续加新维度也很方便:

方法一:用pd.crosstab + pd.concat 组合(直观易扩展)

pd.crosstab天生就是用来做分组计数的神器,能直接生成宽格式的分类计数表,再用pd.concat一次性合并所有统计结果,代码简洁还易维护:

import pandas as pd

# 先确保Date是datetime类型(如果还不是的话)
df['Date'] = pd.to_datetime(df['Date'])

# 1. 计算每日总客户数
total_clients = df.groupby('Date')['Client_Id'].count().rename('Total_Clients')

# 2. 计算每日各性别的客户数
gender_daily = pd.crosstab(df['Date'], df['Gender'])

# 3. 计算每日各年龄组的客户数
age_daily = pd.crosstab(df['Date'], df['Age_Group'])

# 一次性合并所有统计结果
final_result = pd.concat([total_clients, gender_daily, age_daily], axis=1)

优势:

  • 逻辑清晰,每一步对应一个统计维度
  • 后续新增统计维度(比如新增地区分类),只需要再加一个pd.crosstab并加入concat列表即可

方法二:用resample + agg 字典(紧凑高效)

这种方法用一次resample就搞定所有聚合逻辑,代码更紧凑,适合追求简洁的场景:

import pandas as pd

df['Date'] = pd.to_datetime(df['Date'])
df = df.set_index('Date')

# 定义聚合规则字典:键是原列名,值是对应的聚合方式
agg_rules = {
    'Client_Id': 'count',  # 统计每日总客户数
    'Gender': lambda x: x.value_counts(),  # 统计每日性别分布
    'Age_Group': lambda x: x.value_counts()  # 统计每日年龄组分布
}

# 重采样并聚合,然后展开多层列索引
result = df.resample('D').agg(agg_rules).unstack()

# 整理列名(可选,让列名更友好)
result.columns = [
    'Total_Clients' if col[0] == 'Client_Id' 
    else f"{col[0]}_{col[1]}".strip() 
    for col in result.columns
]

优势:

  • 只用一次重采样操作,减少DataFrame的重复处理
  • 聚合规则集中在一个字典里,便于统一管理和修改

方法三:用pivot_table(适合多维度交叉统计)

如果后续需要更复杂的交叉统计,透视表是个不错的选择,不过需要先加一个辅助计数列:

import pandas as pd

df['Date'] = pd.to_datetime(df['Date'])
df['Count'] = 1  # 添加辅助列用于计数

# 生成透视表,行是日期,列是性别+年龄组的组合,值是计数求和
pivot_result = pd.pivot_table(
    df,
    index='Date',
    columns=['Gender', 'Age_Group'],
    values='Count',
    aggfunc='sum',
    fill_value=0
)

# 添加上每日总客户数
pivot_result['Total_Clients'] = df.groupby('Date')['Client_Id'].count()

# 调整列顺序,把总客户数放在最前面(可选)
pivot_result = pivot_result[['Total_Clients'] + [col for col in pivot_result.columns if col != 'Total_Clients']]

优势:

  • 可以直接生成多维度交叉的统计结果,适合需要同时查看性别和年龄组组合分布的场景

这几种方法都能替代你之前的merge链式调用,推荐用方法一或方法二,前者更直观,后者更紧凑,根据你的习惯选择就好~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 06:37:53