Pandas透视表操作:添加每日销量总计列与大于2值的条件计数列
解决透视表添加自定义列的问题
你的问题核心在于透视表是多层列索引结构,直接用iloc硬编码列位置容易失效(比如列顺序变化时),我们可以利用MultiIndex的层级定位精准操作sum聚合列,完美实现你要的两个需求:
1. 添加每日售出产品总量列(sum聚合列的行求和)
你的透视表dft列分为两层:第一层是聚合方式(sum/len),第二层是日期day。我们可以直接通过dft['sum']选中所有sum聚合的列,再对每行求和:
# 生成透视表后,添加总量列 dft['Fruit Total'] = dft['sum'].sum(axis=1)
2. 添加条件计数列(统计sum列中>2的元素数量)
同样先选中sum聚合列,用gt(2)生成布尔值DataFrame(大于2为True,否则为False),再对每行求和(True会被计为1,False为0,求和结果就是符合条件的数量):
# 添加条件计数列 dft['Count >2'] = dft['sum'].gt(2).sum(axis=1)
完整可运行代码示例
import pandas as pd import numpy as np # 生成原始数据 df = pd.DataFrame({ 'date': ["22.10.2021", "22.10.2021", "22.10.2021", "23.10.2021", "23.10.2021", "25.10.2021", "22.10.2021", "23.10.2021", "22.10.2021", "25.10.2021"], 'Product': ["apple", "apple", "orange", "orange", "apple","apple", "apple", "orange", "orange", "orange"], 'sold_kg': [2, 3, 1, 6, 2,2, 3, 1, 6, 2,]}) df['day']=pd.to_datetime(df['date']).dt.day # 生成透视表 dft=df.pivot_table(values='sold_kg', columns ='day', index='Product', aggfunc=[np.sum,len]) # 添加自定义列 dft['Fruit Total'] = dft['sum'].sum(axis=1) dft['Count >2'] = dft['sum'].gt(2).sum(axis=1) print(dft)
运行结果预览
sum len Fruit Total Count >2 day 22 23 25 22 23 25 Product apple 8.0 2.0 2.0 3.0 1.0 1.0 12.0 1 orange 7.0 7.0 2.0 2.0 2.0 1.0 16.0 2
这种方式完全基于列的层级逻辑,不管你的日期day数量怎么变化,代码都能稳定运行,比硬写iloc位置要可靠得多。
内容的提问来源于stack exchange,提问作者Zaur Guliyev
相关产品推荐
相关产品推荐

