一、举例的数据
假设我有个六列的dataframe:一列是销售员,一列是所属团队,其它四列分别是四个季度的销售额。
![](https://i-blog.csdnimg.cn/blog_migrate/b388bc27f4926e8bdc363069b64b6ffe.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/e232dbb19988c6f5822daa3fea2aa29e.webp?x-image-process=image/format,png)
1新增列-基于原有列的全年销售额
首先df['Total ']确保了你在该df内新增了一个column,然后累加便可。
df['Total'] = df['Q1']+df['Q2']+df['Q3']+df['Q4']
![](https://i-blog.csdnimg.cn/blog_migrate/ffa3968e7310cd7382ccd3448f2f9dfd.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/f7b321746cff595d534b59a0c3c79b46.webp?x-image-process=image/format,png)
你可能想使用诸如sum()的函数进行这步,很可惜,sum()方法只能对列进行求和,幸好它可以帮我们求出某季度的总销售额。df['Q1'].sum(),你就能得到一个Q1的总销售额,除此之外,其他的聚合函数,max,min,mean都是可行的。
2分组统计 - 团队竞赛
那么按团队进行统计呢?在mysql里是group by,Pandas里也不例外,你只需要df.groupby('Team').sum()就能看到期望的答案了。
![](https://i-blog.csdnimg.cn/blog_migrate/265749bccc541e1031d83d50b73668dd.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/5a8b354f6f7e5f8bb302e67d93edcef7.webp?x-image-process=image/format,png)
3排序 - 谁是销售冠军
如果你关心谁的全年销售额最多,那么就要求助于sort_values方法了,在excel内是右键筛选,SQL内是一个orderby。默认是顺序排列的,所以要人为设定为False,如果你只想看第一名,只需要在该语句末尾添加.head(1) 。
![](https://i-blog.csdnimg.cn/blog_migrate/c50539b1d58734839484d720cbc513a2.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/f71807180a0d0b66953605faabf80c1c.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/0a24c07dcc6ae364c1f8e3a7b674734e.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/74c853ee60d1c26719d389ab01962723.webp?x-image-process=image/format,png)
4切片-只给我看我关心的行
接下来就是涉及一些条件值的问题,例如我只关心Team为A的数据,在Excel里是筛选框操作,在SQL里写个where就能搞定,在Pandas里需要做切片。
查看Pandas文档时,你可能已经见过各种切片的函数了,有loc,iloc,ix,iy,这里不会像教科书一样所有都讲一通让读者搞混。这种根据列值选取行数据的查询操作,推荐使用loc方法。
df.loc[df['Team']== 'A',['Salesman', 'Team','Year']],这里用SQL语法理解更方便,loc内部逗号前面可以理解为where,逗号后可以理解为select的字段。
![](https://i-blog.csdnimg.cn/blog_migrate/f33f804eb415ba0335a650d1ceca58ea.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/ba7ebd4e8b74ba0fb910613544ed49b3.webp?x-image-process=image/format,png)
如果想全选出,那么只需将逗号连带后面的东西删除作为缺省,即可达到select *的效果。
![](https://i-blog.csdnimg.cn/blog_migrate/cb107bb4e51f06de21d57075a6167e26.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/fc3ab21427bf7229cf9efe3cddcae7f8.webp?x-image-process=image/format,png)
5切片 - 多条件筛选
在Pandas中多条件切片的写法会有些繁琐,df.loc[ (df['Team']== 'A' ) & (df['Total'] > 15000 ) ],添加括号与条件
![](https://i-blog.csdnimg.cn/blog_migrate/e1d762c1653b365d5677eeb2f0f0f975.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/442fad69bd4e540e77661ce9e489a3d8.webp?x-image-process=image/format,png)
这里有一个有意思的小应用,如果你想给符合某些条件的员工打上优秀的标签,你就可以结合上述新增列和切片两点,进行条件赋值操作。
df.loc[ (df['Team']== 'A' ) & (df['Total'] > 15000 ) , 'Tag'] = 'Good'
![](https://i-blog.csdnimg.cn/blog_migrate/0cf6a16d1a085b59a5c21cc2934ac8cc.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/db61ef310a339355493a3c955db540b6.webp?x-image-process=image/format,png)
6删除列 - 和查询无关,但是很有用
当然这里只是个举例,这时候我想删除Tag列,可以del df['Tag'],又回到了之前。
二、连接
接下来要讲join了,现在有每小时销售员的职位对应表pos,分为Junior和Senior,要将他们按对应关系查到df中。
这里需要认识一下新朋友,merge方法,将两张表作为前两个输入,再定义连接方式和对应键。对应到Excel中是Vlookup,SQL中就是join。在pandas里的连接十分简单。
df = pd.merge(df, pos, how='inner', on='Salesman')
注意,这个时候其实我们是得到了新的df,如果不想覆盖掉原有的df,你可以在等号左边对结果重新命名。
这时候有了两组标签列(对应数值列),就可以进行多重groupby了。
当然这样的结果并不能公平地反应出哪一组更好,因为每组的组员人数不同,可能有平均数的参与会显得更合理,并且我们只想依据全年综合来评价。
![](https://i-blog.csdnimg.cn/blog_migrate/3b13ee6d05f4c3457ff8ab15adfae856.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/1685b7ade42199701f4272dfd49248a5.webp?x-image-process=image/format,png)
这里的数据是捏造的,不过也一目了然了。
三、合并操作
最后以最简单的一个合并操作收尾。
如果我又有一批数据df2,需要将两部分数据合并。只需要使用concat方法,然后传一个列表作为参数即可。不过前提是必须要保证他们具有相同类型的列,即使他们结构可能不同(df2的Team列在末尾,也不会影响concat结果,因为pandas具有自动对齐的功能)。
pd.concat([df,df2])
![](https://i-blog.csdnimg.cn/blog_migrate/93b9a057cb483dfd2f1132a3f828c08b.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/bd55f871d86d5cbeb1efccfde66658f7.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/9d84b6ed2df9cbc12d73483a586bacd7.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/e12de188116c316ad1c2a6dfaeb0990c.webp?x-image-process=image/format,png)
转自: https://www.zhihu.com/question/56310477/answer/277000149