如何用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
相关产品推荐
相关产品推荐

