在pandas库中实现Excel的数据透视表效果通常用的是df['a'].value_counts()这个函数,表示统计数据框(DataFrame) df的列a各个元素的出现次数;例如对于一个数据表如pd.DataFrame({'a':['A','A','B','C','C','C'],'b':[1,2,3,4,5,6],'c':[11,11,12,13,13,14]}),其透视表效果如下:

Excel数据透视表与Python实现对比

就是对表df中的a列各个值出现的次数进行统计。

Pandas中的数据透视表各功能

用过Excel透视表功能的话我们知道,出了统计出现次数之外,还可以选择计算某行的求和、最大最小值、平均值等(数据透视表对于数值类型的列默认选求和,文本类型默认选计数),还是拿表df来说,excel的数据透视表可以计算a列的A、B、C三个元素对应的c列的求和(sum),但是pandas库并没有value_sum()这样的函数,pandas的sum函数是对整列求和的,例如df['b'].sum()是对b列求和,结果是21,和a列无关;所以我们可以自己按照根据a列分表再求和的思路去实现。自己造轮子的做法可以是:def df_value_sum(df,by='a',s='b'):#by和s分别对应根据a列对b列的数求和

keys=set(df[by])

ss={}

for k in keys:

d=df.loc[df[by]==k]

ss[k]=d[s].sum()

return ss #返回一个字典

对于上面的表df,该函数df_value_sum(df,by='a',s='b')的输出是一个字典,{'B': 3, 'C': 15, 'A': 3},字典可以进一步转为DataFrame。同样的方法可以写出df_value_max(df)、df_value_min(df)、 df_value_min(df) df_value_avg(df)等;如果需要对除a外的所有列进行分组求和操作,可以用df.groupby('a').sum(),会输出一个DataFrame。

去重的数据透视表计数

另外还有一个很重要的需求是统计某列不重复元素的计数,这个用数据透视表是不能直接算出来的,例如有一个用户订单表,一个用户可能下了多个订单,用户有渠道属性,需要统计一段时间内各渠道的付费用户数,直接在透视表的行选渠道,值选uid计数,得到的是没去重的结果,拿df表来说,假设c列是用户id,a列是渠道,想统计a列的A、B、C各渠道各有多少付费用户数,透视表的结果和期望的结果如下图:

常规透视表与期望的去重效果对比

可以看到直接对c列计数是不去重的,和我们想要的不一样。pandas库的.value_counts()库也是不去重的统计,查阅value_counts的官方文档可以发现,这个函数通过改变参数可以实现基础的分组计数、频率统计和分箱计数,normalize参数设置为True则将计数变成频率,例如df的a列中共有6行,而C出现了3次,于是C对应的值就是0.5;bin参数可以设置分箱;dropna可以设置是否考虑缺失值,默认是不考虑(可以结合normalize影响频率);sort可以设置是否根据统计值进行排序(关于value_counts函数的更多内容可以再看下官方文档)。复用之前df_value_sum(df)的思路和代码,可以这么实现去重的计数需求:def df_value_countdistinct(df,by='a',s='c'):

keys=set(df[by])

ss={}

for k in keys:

d=df.loc[df[by]==k] w

ss[k]=len(set(d[s]))

return ss![Screenshot from 2019-08-15 22-17-26.png](https://upload-images.jianshu.io/upload_images/2473543-d12c2f83dc6f6b8a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

调用这个函数df_value_countdistinct(df,by='a',s='c')得到的结果就是A对应1,B对于1,C对应2,通过set对c列去重后再计数。查资料的过程中发现StackOverflow网站提供的一种解法很优雅,思路就是把根据a列分表的过程直接用df.groupby('a')实现,于是直接写df.groupby('a').c.nunique()或df.groupby('a').['c'].nunique()就是期望的结果,效率比用for循环更高,值得学习。

Python的去重计数实现

python去重计数_用Python实现透视表的value_sum和countdistinct功能相关推荐

  1. python去重计数_用Python做透视表之value_sum和value_countdistinct功能

    在pandas库中实现Excel的数据透视表效果通常用的是df['a'].value_counts()这个函数,表示统计数据框(DataFrame) df的列a各个元素的出现次数:例如对于一个数据表如 ...

  2. python去重计数_如何python快速实现数组的去重计数

    问题描述 对一个list=['a', 'a', 'b', 'c', 'a'],计算出截止每个位置为止去重后的元素个数.即:位置=0时, list[0:1] = ['a'],元素去重后个数为1 位置=1 ...

  3. python去重算法_使用Python检测文章抄袭及去重算法原理解析

    在互联网出现之前,"抄"很不方便,一是"源"少,而是发布渠道少:而在互联网出现之后,"抄"变得很简单,铺天盖地的"源"源 ...

  4. python 时间序列预测_使用Python进行动手时间序列预测

    python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...

  5. python 概率分布模型_使用python的概率模型进行公司估值

    python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...

  6. python图像计数_计算机视觉:利用OpenCV和Python进行车辆计数详细步骤

    本教程我将分享几个简单步骤解释如何使用OpenCV进行Python对象计数. 需要安装一些软件: Python 3 OpennCV 1.了解Opencv从摄像头获得视频的Python脚本import ...

  7. python写透视挂_用Python实现数据的透视表的方法

    在处理数据时,经常需要对数据分组计算均值或者计数,在Microsoft Excel中,可以通过透视表轻易实现简单的分组运算.而对于更加复杂的分组运算,Python中pandas包可以帮助我们实现. 1 ...

  8. python高斯求和_利用Python进行数据分析(3)- 列表、元组、字典、集合

    本文主要是对Python的数据结构进行了一个总结,常见的数据结构包含:列表list.元组tuple.字典dict和集合set. image 索引 左边0开始,右边-1开始 通过index()函数查看索 ...

  9. python希腊字母字符串_#10 Python字符串

    前言 通过上一节可知,Python6个序列的内置类型中,最常见的是列表和元组,但在Python中,最常用的数据类型却不是列表和元组,而是字符串.要想深入了解字符串,必须先掌握字符编码问题.因此本篇博文 ...

最新文章

  1. 20159208 《网络攻防实践》第七周学习总结
  2. Jumping Monkey 并查集,反向思维
  3. jq定制上传按钮,选择文件就上传
  4. 用ASP实现简单的繁简转换
  5. [java]常用类型转化
  6. python mp4 切片_FFmpeg MP4视频切片成TS m3u8播放 好文收集
  7. Java多线程4:synchronized锁机制
  8. 废旧纸箱做机器人图片_制作纸箱板画(适合1112岁孩子们)
  9. 程序员,你还要迷茫多久?
  10. 【linux C】C语言中常用的几个函数的总结【二】
  11. 无人值守地磅电子汽车衡中称重系统传感器原理及应用
  12. bootdo 重命名 版本2.0 (适合所有springboot项目)
  13. 在EXCEL中插入超级链接
  14. html中文字不自动换行 white-space style
  15. 如何运用计算机教学教学的收获,计算机教学中行动感悟法的应用
  16. 万字长文---手把手教你加固内核安全配置
  17. Lytro 一代资料.缘起
  18. oracle 认证考试信息 ocp
  19. C++17之std::optional
  20. QT用法--添加外部库文件(lib文件)

热门文章

  1. 【Flink】Flink key 应该分配到哪个 KeyGroup 以及 KeyGroup 分配在哪个subtask
  2. 【算法】剑指 Offer 53 - I. 在排序数组中查找数字 I
  3. 【FLink】Flink 消费 kafka 消费组 死掉 Marking the coordinator dead for group 造成数据重复消费
  4. 20-40-020-安装-kafka-eagle-bin-1.3.3安装
  5. 【Java】Java 反射机制浅析
  6. 【Flink】Flink 启动报错 DirectoryNotEmptyException Could not close resource
  7. 60-008-024-使用-命令-flink如何动态支持依赖jar包提交
  8. Sping : @InitBinder注解
  9. kafka报错:Error writing out kafka.log:type=Log,name=LogStartOffset,topic=xx EofException
  10. 【安全】Ceotos 7.5.1804 安装openldap 2.4.44