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

如何用Pandas DataFrame按日期汇总计数并将Item设为列名

Pandas按日期汇总数据并去除列层级标签

原始数据

首先定义初始DataFrame:

import pandas as pd
df = pd.DataFrame(
    {
        "Date": [
            pd.Timestamp("2000-01-02"), 
            pd.Timestamp("2000-01-02"), 
            pd.Timestamp("2000-01-05"), 
            pd.Timestamp("2000-01-06"), 
            pd.Timestamp("2000-01-06"), 
            pd.Timestamp("2000-01-06") 
        ],
        "Item": ["A", "A", "B", "C", "C", "C"]
    }
)

生成的初始数据如下:

Date        Item
0   2000-01-02  A
1   2000-01-02  A
2   2000-01-05  B
3   2000-01-06  C
4   2000-01-06  C
5   2000-01-06  C

需求

按日期汇总数据,将Item的取值作为列标题,得到如下格式的结果:

Date        A   B   C
2000-01-02  2   0   0
2000-01-05  0   1   0
2000-01-06  0   0   3

尝试的代码及问题

使用pivot_table后得到带层级列标签的结果,多余的Item标签需要去除:

pivot_df = df.pivot_table(index='Date', columns='Item', aggfunc=len, fill_value=0)

得到的结果:

Item        A   B   C
Date            
2000-01-02  2   0   0
2000-01-05  0   1   0
2000-01-06  0   0   3

解决方法

方法1:处理pivot_table结果的列层级

对pivot_table生成的结果,先去掉列的上层标签,再将Date从索引转为列:

pivot_df = df.pivot_table(index='Date', columns='Item', aggfunc=len, fill_value=0)
# 移除列的层级标签
pivot_df.columns = pivot_df.columns.droplevel(0)
# 将Date从索引转为普通列
pivot_df = pivot_df.reset_index()
# 清除列名的层级标识
pivot_df.columns.name = None

方法2:使用pd.crosstab直接生成

crosstab可以直接生成无层级列标签的结果,写法更简洁:

pivot_df = pd.crosstab(df['Date'], df['Item'], dropna=False)
# 可选:将Date从索引转为普通列
pivot_df = pivot_df.reset_index()
pivot_df.columns.name = None

方法3:groupby + unstack组合操作

先按日期和Item分组计数,再将Item展开为列,最后处理格式:

pivot_df = df.groupby(['Date', 'Item']).size().unstack(fill_value=0).reset_index()
pivot_df.columns.name = None

最终结果

执行上述任意方法后,均可得到目标格式:

Date  A  B  C
0 2000-01-02  2  0  0
1 2000-01-05  0  1  0
2 2000-01-06  0  0  3

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 19:52:31