python数据分析之Pandas:汇总和计算描述统计
pandas对象拥有一组常用的数学和统计方法,大部分都属于约简和汇总统计,用于从Series中提取单个的值,或者从DataFrame中的行或列中提取一个Series。相比Numpy而言,Numpy都是基于没有缺失数据的假设而构建的。
来看一个简单的例子
In [6]: df=DataFrame([[1.4,np.nan],[7,-4],[np.nan,np.nan],[0.75,-1.3]],index=['a
...: ','b','c','d'],columns=['one','two'])
在df中,有些行的数据是空的,没有实际意义
In [7]: df
Out[7]:
one two
a 1.40 NaN
b 7.00 -4.0
c NaN NaN
d 0.75 -1.3
但是在用sum计算的时候依然能够计算出每一列的值
In [8]: df.sum()
Out[8]:
one 9.15
two -5.30
dtype: float64
传入axis=1会按照行的方式进行计算
In [9]: df.sum(axis=1)
Out[9]:
a 1.40
b 3.00
c 0.00
d -0.55
dtype: float64
约简方法的选项:
间接统计(比如达到最小值和最大值的索引)
In [10]: df.idxmax()
Out[10]:
one b
two d
dtype: object
In [11]: df.max()
Out[11]:
one 7.0
two -1.3
dtype: float64
累加型:
In [12]: df.cumsum()
Out[12]:
one two
a 1.40 NaN
b 8.40 -4.0
c NaN NaN
d 9.15 -5.3
还有一种比较强大的方法describe用于一次性产生多个汇总统计。其中mean为平均值,std为标准差
In [13]: df.describe()
Out[13]:
one two
count 3.000000 2.000000
mean 3.050000 -2.650000
std 3.436204 1.909188
min 0.750000 -4.000000
25% 1.075000 -3.325000
50% 1.400000 -2.650000
75% 4.200000 -1.975000
max 7.000000 -1.300000
描述和汇总的方法:
唯一值,值计数以及成员资格
还有一类方法可以从一维Series的值中抽取信息。以下面这个Series为例
In [15]: obj=Series(['c','a','d','a','a','b','d','c','c'])
In [16]: uni=obj.unique()
In [17]: uni
Out[17]: array(['c', 'a', 'd', 'b'], dtype=object)
返回的结果是未排序的,如果需要排序的话可以对uni采用sort的方法。
In [18]: uni.sort()
In [19]: uni
Out[19]: array(['a', 'b', 'c', 'd'], dtype=object)
value_counts统计Serises中各值出现的概率
In [21]: obj.value_counts()
Out[21]:
c 3
a 3
d 2
b 1
dtype: int64
同样的得到的结果也是未排序的,如果要排序的话按照下面的方法进行
In [22]: pd.value_counts(obj.values,sort=False)
Out[22]:
a 3
c 3
b 1
d 2
dtype: int64
那么这些功能也是可以针对DataFrame使用的,使用方法如下
In [23]: data=DataFrame({'qu1':[1,3,4,3,4],'qu2':[2,3,1,2,3],'qu3':[1,5,2,4,4]})
...:
In [24]: data
Out[24]:
qu1 qu2 qu3
0 1 2 1
1 3 3 5
2 4 1 2
3 3 2 4
4 4 3 4
将pandas的value_counts传给该DataFrame的apply函数。
In [25]: result=data.apply(pd.value_counts).fillna(0)
得到的是
In [26]: result
Out[26]:
qu1 qu2 qu3
1 1.0 1.0 1.0
2 0.0 2.0 1.0
3 2.0 2.0 0.0
4 2.0 0.0 2.0
5 0.0 0.0 1.0
处理缺失数据
pandas使用浮点值NaN表示浮点和非浮点数组中的缺失数据。NA的处理方法如下:
In [27]: data=Series(['abc','antick',np.nan,'avocado'])
In [28]: data.isnull()
Out[28]:
0 False
1 False
2 True
3 False
dtype: bool
In [29]: data.fillna('zero')
Out[29]:
0 abc
1 antick
2 zero
3 avocado
dtype: object
In [30]: data.notnull()
Out[30]:
0 True
1 True
2 False
3 True
dtype: bool
丢弃全为空的数据
In [31]: data.dropna()
Out[31]:
0 abc
1 antick
3 avocado
dtype: object
但在DataFrame中,如果直接采用dropna的话将会默认丢弃任何含有缺省值的行。
In [32]: data=DataFrame([[1,6.5,3],[1,None,None],[None,None,None],[None,6.4,3]])
...:
In [33]: data
Out[33]:
0 1 2
0 1.0 6.5 3.0
1 1.0 NaN NaN
2 NaN NaN NaN
3 NaN 6.4 3.0
In [34]: clean=data.dropna()
In [35]: clean
Out[35]:
0 1 2
0 1.0 6.5 3.0
传入how=’all’将只丢弃全为NA的那些行
In [36]: clean=data.dropna(how='all')
In [37]: clean
Out[37]:
0 1 2
0 1.0 6.5 3.0
1 1.0 NaN NaN
3 NaN 6.4 3.0
加入axis=1将会丢弃全为None的列
In [38]: clean=data.dropna(axis=1,how='all')
In [39]: clean
Out[39]:
0 1 2
0 1.0 6.5 3.0
1 1.0 NaN NaN
2 NaN NaN NaN
3 NaN 6.4 3.0
填充缺失数据
有些时候其实并不想要丢弃为空的数据,只是想换个显示名称或者通过其他方式来填补这些空洞。这个方法在前面其实也用过就是fillna
In [40]: data.fillna(0)
Out[40]:
0 1 2
0 1.0 6.5 3.0
1 1.0 0.0 0.0
2 0.0 0.0 0.0
3 0.0 6.4 3.0
如果想差异化的填充,比如第一列的空数据填充0,第二列的空数据填充-1.fillna也是有方法的。传入一个字典即可
In [41]: data
Out[41]:
0 1 2
0 1.0 6.5 3.0
1 1.0 NaN NaN
2 NaN NaN NaN
3 NaN 6.4 3.0
字典的键值就代表列的索引,下面这个就是将第一列的空值填充为0,第二列的空值填充为-1
In [42]: data.fillna({1:0,2:-1})
Out[42]:
0 1 2
0 1.0 6.5 3.0
1 1.0 0.0 -1.0
2 NaN 0.0 -1.0
3 NaN 6.4 3.0
再看下前向插值和后向插值。method=ffill是前向插值,也就是根据空值的前面的值进行插入
In [43]: data.fillna(method='ffill')
Out[43]:
0 1 2
0 1.0 6.5 3.0
1 1.0 6.5 3.0
2 1.0 6.5 3.0
3 1.0 6.4 3.0
method=backfill为后向插值,也就是根据空值后面的值进行插入
In [44]: data.fillna(method='backfill')
Out[44]:
0 1 2
0 1.0 6.5 3.0
1 1.0 6.4 3.0
2 NaN 6.4 3.0
3 NaN 6.4 3.0
fillna函数的参数
层次化索引
层次化索引是pandas的一个很重要的功能。它能使你在一个轴上拥有多个索引级别,也就是以低维度形式处理高维度的数据
In [50]: data=Series(np.random.randn(10),index=[['a','a','a','b','b','b','c','c'
...: ,'d','d',],[1,2,3,1,2,3,1,2,1,2]])
In [51]: data
Out[51]:
a 1 1.085711
2 0.018760
3 -0.357718
b 1 1.147850
2 -0.065931
3 -0.012061
c 1 -0.736660
2 -1.483384
d 1 -0.403322
2 -0.309897
dtype: float64
In [52]: data.index
Out[52]:
MultiIndex(levels=[[u'a', u'b', u'c', u'd'], [1, 2, 3]],
labels=[[0, 0, 0, 1, 1, 1, 2, 2, 3, 3], [0, 1, 2, 0, 1, 2, 0, 1, 0, 1]])
在上面的这个例子中,a,b,c,d可以看做是外层索引。双层索引的使用
In [53]: data['a']
Out[53]:
1 1.085711
2 0.018760
3 -0.357718
dtype: float64
In [54]: data['a'][1]
Out[54]: 1.0857109651061458
In [55]: data['a'][2]
Out[55]: 0.018760105407126977
还可以在内层中提取数据
In [58]: data[:,2]
Out[58]:
a 0.018760
b -0.065931
c -1.483384
d -0.309897
dtype: float64
In [67]: data['a':'b']
Out[67]:
a 1 1.085711
2 0.018760
3 -0.357718
b 1 1.147850
2 -0.065931
3 -0.012061
dtype: float64
In [68]: data['a':'b'][2]
Out[68]: -0.3577177301843591
同样的对于DataFrame也可以进行类似的分层
In [69]: frame=DataFrame(np.arange(12).reshape((4,3)),index=[['a','a','b','b'],[
...: 1,2,1,2]],columns=[['chengdu','chongqing','beijing'],['Green','Red','Gr
...: een']])
In [70]: frame
Out[70]:
chengdu chongqing beijing
Green Red Green
a 1 0 1 2
2 3 4 5
b 1 6 7 8
2 9 10 11
索引方式如下:
In [73]: frame['chengdu']
Out[73]:
Green
a 1 0
2 3
b 1 6
2 9
In [74]: frame['chengdu']['Green']
Out[74]:
a 1 0
2 3
b 1 6
2 9
Name: Green, dtype: int64
In [75]: frame['chengdu']['Green']['a']
Out[75]:
1 0
2 3
还可以给各层进行命名
In [79]: frame.index.names=['key1','key2']
In [80]: frame.columns.names=['city','color']
In [81]: frame
Out[81]:
city chengdu chongqing beijing
color Green Red Green
key1 key2
a 1 0 1 2
2 3 4 5
b 1 6 7 8
2 9 10 11
根据级别汇总统计
我们可以根据行或列上的级别来进行求和
对key2的列相同的值进行求和计算
In [82]: frame.sum(level='key2')
Out[82]:
city chengdu chongqing beijing
color Green Red Green
key2
1 6 8 10
2 12 14 16
也就是a的key2列等于1的值和b的key2列等于1的值求和。a的key2列等于2的值和b的key2列等于2的值求和
如果要针对a和b分别求助,则采用level=key1的方式
In [83]: frame.sum(level='key1')
Out[83]:
city chengdu chongqing beijing
color Green Red Green
key1
a 3 5 7
b 15 17 19
对color相同的进行行求和。
In [87]: frame.sum(level='color',axis=1)
Out[87]:
color Green Red
key1 key2
a 1 2 1
2 8 4
b 1 14 7
2 20 10
python数据分析之Pandas:汇总和计算描述统计的更多相关文章
- pandas汇总和计算描述统计
pandas 对象拥有一组常用的数学和统计方法. 他们大部分都属于简约和汇总统计, 用于从Series中提取单个值(如sum或mean) 或从DataFrame的行或列中提取一个Series.跟对应的 ...
- 【学习】数据处理基础知识(汇总和计算描述统计)【pandas】
pd对象拥有一组常用的数学和统计方法.大部分都属于约简和汇总统计,用于从Series中单个值,如sum 和 mean 或从DF的行或列中提取一个Series. 1. 描述和汇总统计方法 #汇总和计算描 ...
- Python数据分析库pandas基本操作
Python数据分析库pandas基本操作2017年02月20日 17:09:06 birdlove1987 阅读数:22631 标签: python 数据分析 pandas 更多 个人分类: Pyt ...
- Python数据分析之pandas基本数据结构:Series、DataFrame
1引言 本文总结Pandas中两种常用的数据类型: (1)Series是一种一维的带标签数组对象. (2)DataFrame,二维,Series容器 2 Series数组 2.1 Series数组构成 ...
- Python 数据分析:Pandas 缺省值的判断
Python 数据分析:Pandas 缺省值的判断 背景 我们从数据库中取出数据存入 Pandas None 转换成 NaN 或 NaT.但是,我们将 Pandas 数据写入数据库时又需要转换成 No ...
- Python数据分析之pandas学习
Python中的pandas模块进行数据分析. 接下来pandas介绍中将学习到如下8块内容:1.数据结构简介:DataFrame和Series2.数据索引index3.利用pandas查询数据4.利 ...
- Python数据分析之pandas
Python中的pandas模块进行数据分析. 接下来pandas介绍中将学习到如下8块内容:1.数据结构简介:DataFrame和Series2.数据索引index3.利用pandas查询数据4.利 ...
- Python数据分析之Pandas操作大全
从头到尾都是手码的,文中的所有示例也都是在Pycharm中运行过的,自己整理笔记的最大好处在于可以按照自己的思路来构建矿建,等到将来在需要的时候能够以最快的速度看懂并应用=_= 注:为方便表述,本章设 ...
- python数据分析之pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]
1 引言 Pandas是作为Python数据分析著名的工具包,提供了多种数据选取的方法,方便实用.本文主要介绍Pandas的几种数据选取的方法. Pandas中,数据主要保存为Dataframe和Se ...
随机推荐
- 聊聊、Zookeeper Linux 启动
Zookeeper 在 windows 下安装比较简单,属于无脑式安装,下载下来双击脚本就可以了.前面的文章中也有介绍,今天我来写写 Linux 下的安装,以及所碰到的坑. 首先,登陆 Linux 系 ...
- 【spring boot】10.spring boot下的单元测试
spring boot下的单元测试,思前想后还是需要单独用一章篇幅来看看. 然后在看了介绍和使用时候,我感觉并不想多去看了. 但是还是给后来人留下参考的路径: 官网说明:https://spring. ...
- 对ps4 cmask fmask的理解
这俩都是绑在corlor target上8x8的格子 cmask 做fastclear 这个比较好理解,8x8来表示这个格子是否clear fmask msaa用 provided to suppor ...
- [Android实例] Scroll原理-附ScrollView源码分析 (转载)
想象一下你拿着放大镜贴很近的看一副巨大的清明上河图, 那放大镜里可以看到的内容是很有限的, 而随着放大镜的上下左右移动,就可以看到不同的内容了 android中手机屏幕就相当于这个放大镜, 而看到的内 ...
- Windows 2008 R2 Server FTP使用问题
Windows 2008 R2 Server FTP必须在安装IIS的时候.安装IIS6.0兼职性. 否则建的FTP网站仅仅有关了防火墙才干使用. 原因未知.
- Chrome 插件 CrxMouse 去除后门优化版
说明 CrxMouse 是一款挺不错的 Chrome 插件.仅仅是据说这个插件会在后台偷偷的上传用户的浏览数据,无论上传的内容是不是涉及隐私数据,总让人认为不放心,可是因为插件本身功能还是挺好用的,所 ...
- 应用程序之Xib自定义Cell
效果展示 结构分析 代码实现 一.效果展示 二.结构分析 1⃣️首先我们让我们的控制器不再继承UIViewController,而是继承UITableViewController.这样就直接遵守了de ...
- mysql经常使用查询:group by,左连接,子查询,having where
前几天去了两个比較牛的互联网公司面试.在sql这块都遇到问题了,哎.可惜呀,先把简单的梳理一下 成绩表 score 1.group by 使用 按某一个维度进行分组 比如: 求每一个同学的总分 SEL ...
- oracle 表压缩技术
压缩表是我们维护管理中常常会用到的.以下我们看都oracle给我们提供了哪些压缩方式. 文章摘自"Oracle® Database Administrator's Guide11g Rele ...
- git 操作分支
1. git 查看本地分支:git branch 2. git 查看所有分支:git branch -a 3. git 新建本地分支:git branch branchName 4. git 新建分支 ...