看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
日常办公,免不了处理数据表格,大多情况下都可以让 pandas 自动地实现数据的处理。本例是对销售情况进行一个统计分析,来看看哪位销量人员在月份维度上表现更佳。
有以下表格,第一列为销售人员姓名,后继列为不同月份其销售金额:
import pandas as pd
dct = {
'姓名': ['张三','李四','王五','赵六'],
'1月':['100','150','200','300'],
'2月':['150','250','300','400'],
'3月':['200','250','300','500'],
'4月':['150','300','200','400'],
'5月':['200','100','300','200'],
'6月':['200','100','300','200'],
'7月':['200','100','300','200'],
}
df = pd.DataFrame(dct)
df
'''
姓名 1月 2月 3月 4月 5月 6月 7月
0 张三 100 150 200 150 200 200 200
1 李四 150 250 250 300 100 100 100
2 王五 200 300 300 200 300 300 300
3 赵六 300 400 500 400 200 200 200
'''
需要得到以下统计后的列:
后边两例分别是该销售人员销售额超过 200、300 的月份数。
原数据一个展开在列上的数据,要以姓名为维度分析,因此我们不需要进行分组,当前维度已经可以满足。
主要计算的数据在姓名后有列一,因此我们可将姓名列先设置为索引,避免它参与计算。
我们还发现数字全为字符类型,我们可以将其全部转为数字。
然后再原表上增加需要的两列,最后将月份列筛除。
计算需要的两列时,要判断每个值是否大于 200 和 300,如果是的话对应位置就为 True,形成一个布尔序列,然后利用 True 为 1 的特性将序列 sum() 求和,sum() 传入 axis=1 则按行计算才符合我们的需求。
以下是按照思路实现的代码:
(
df.set_index('姓名')
.astype(int)
.assign(销售额大于200的月份数量=lambda col: (col>200).sum(1))
.assign(销售额大于300的月份数量=lambda col: (col>300).sum(1))
.iloc[:,-2:]
)
'''
销售额大于200的月份数量 销售额大于300的月份数量
姓名
张三 0 0
李四 3 0
王五 5 0
赵六 4 3
'''
这样就完成了需求。
(完)
更新时间:2024-08-18 15:56:33 标签:pandas python 销量 办公