十分钟学习pandas

一、导语

这篇文章从pandas官网翻译:链接,而且也有很多网友翻译过,而我为什么没去看他们的,而是去官网自己艰难翻译呢?

毕竟这是一个学习的过程,别人写的不如自己写的记忆深刻。那么开始吧。

1、pandas是什么?

pandas是基于numpy的数据分析库(如果你没了解过numpy,可以在我的博客看numpy相关的文章),提供快速、灵活和富有表现力的数据结构。

pandas的数据结构分为Series(一维)和DataFrame(二维)。这两个主要的数据结构在金融,统计,社会科学和许多工程领域大展神威。

2、pandas能做什么?

  • 轻松处理丢失的数据(以NaN表示)
  • 大小可变性:可以从DataFrame和更高维的对象插入和删除列
  • 自动显式的数据对齐
  • 灵活的按组功能来执行对数据集拆分、联合操作
  • 可轻松地将Python和Numpy数据结构中的不同索引的数据转换为DataFrame对象
  • 可以智能地对大型数据集基于标签进行切片
  • 直观的合并和连接数据集
  • 数据集灵活的重塑和旋转
  • 坐标轴分层标记
  • 强大是IO工具:可以从CSV、Excel文件、数据库加载数据,以及从超快的HDF5格式保存和加载数据
  • 时间序列-特定功能:日期范围生成和频率转换

3、导入numpy、pandas库

	import pandas as pd
import numpy as np

二、对象的创建

1、创建一个Series:index

	s = pd.Series([1,2,3,4],index=list('abcd'))
out:
a 1
b 2
c 3
d 4
dtype: int64

2、创建一个DataFrame

通过numpy数组,并制定日期时间索引和标签列来创建

	dates = pd.date_range('20170123',periods=6)
print(dates)
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('abcd'))
print(df) out: DatetimeIndex(['2017-01-23', '2017-01-24', '2017-01-25', '2017-01-26',
'2017-01-27', '2017-01-28'],
dtype='datetime64[ns]', freq='D') a b c d
2017-01-23 -1.081953 2.547690 0.428435 -2.513003
2017-01-24 -1.123833 -2.080332 0.540281 1.100093
2017-01-25 0.048541 -0.295839 -0.236631 0.107606
2017-01-26 -0.890604 0.408112 0.765936 -0.829474
2017-01-27 -0.845467 2.140932 0.046358 -0.557103
2017-01-28 0.448769 0.584306 -1.892730 -2.223615

通过传递一个可以转换为一系列的对象的字典

	df2 = pd.DataFrame({
'A':1,
'B':pd.Timestamp('20100123'),
'C':pd.Series(1,index=list(range(4)),dtype='float32'),
'D':np.array([3] * 4,dtype='int32'),
'E':pd.Categorical(['test','train','test','train']),
'F':'foobar'
})
print(df2)
print('df2 dtypes:')
print(df2.dtypes) out:
A B C D E F
0 1 2010-01-23 1.0 3 test foobar
1 1 2010-01-23 1.0 3 train foobar
2 1 2010-01-23 1.0 3 test foobar
3 1 2010-01-23 1.0 3 train foobar df2.dtypes:
A int64
B datetime64[ns]
C float32
D int32
E category
F object
dtype: object

三、查看数据

1、查看数据的顶部和底部的行

	df.head(2) #默认为5行
year month day hour season
0 2010.0 5.0 29.0 17.0 1.0
1 2014.0 2.0 15.0 15.0 4.0 df.tail()
year month day hour season
37788 2014.0 1.0 4.0 0.0 4.0
37789 2014.0 4.0 3.0 8.0 1.0

2、显示索引、列和底层的Numpy数据

  • df.index 显示索引
  • df.columns 显示列名
  • df.values 返回的是一个numpy.ndarray类型

3、显示数据的快速统计摘要

 df.describe()
			a			b			c			d
count 6.000000 6.000000 6.000000 6.000000
mean -0.574091 0.550811 -0.058059 -0.819249
std 0.658465 1.683878 0.967726 1.374977
min -1.123833 -2.080332 -1.892730 -2.513003
25% -1.034116 -0.119852 -0.165884 -1.875080
50% -0.868035 0.496209 0.237396 -0.693288
75% -0.174961 1.751775 0.512319 -0.058571
max 0.448769 2.547690 0.765936 1.100093

4、翻转数据

  • df.T

5、按轴排序

	df2.sort_index(axis=0,ascending=False)
	A	B			C		D		E	F
3 1 2010-01-23 1.0 3 train foobar
2 1 2010-01-23 1.0 3 test foobar
1 1 2010-01-23 1.0 3 train foobar
0 1 2010-01-23 1.0 3 test foobar

6、按值排序

	df2.sort_values(by='E')
	A	B			C	D	E		F
0 1 2010-01-23 1.0 3 test foobar
2 1 2010-01-23 1.0 3 test foobar
1 1 2010-01-23 1.0 3 train foobar
3 1 2010-01-23 1.0 3 train foobar

四、选择数据

1、通过['column_name']选择一个列,得到Series

df['A'] #等效于df.A

2、通过[]切片选择行

  	df['day'][:6]
0    29.0
1 15.0
2 6.0
3 5.0
4 25.0
5 26.0
Name: day, dtype: float64

3、基于标签选择

.loc属性是主访问方法。以下是有效的输入:

  • 单个标签,例如5或'a'(在这里5被解释为索引的标签)
  • 标签的列表或者数组['a,'b','c']
  • 具有标签 'b':'e'的切片对象(注意,这里与通常的python切片相反,包括开始和停止,他是包括开始和结束的)
  • 可以是一个布尔数组
  • 一个callable
s1 = pd.Series(np.random.randn(6),index=list('abcdef'))
out:
a 1.715955
b 0.307930
c -0.971638
d -0.594908
e -3.134987
f 0.396613
dtype: float64

s1.loc['b':'e']
out:
b 0.307930
c -0.971638
d -0.594908
e -3.134987
dtype: float64

s1.loc['b']
out:
0.30792993178289157

还可以用来设置value

s1.loc['b'] = 0
out:
a 1.715955
b 0.000000
c -0.971638
d -0.594908
e -3.134987
f 0.396613
dtype: float64

使用在DataFrame

df1 = pd.DataFrame(np.random.randn(6,4),
index = list('abcdef'),
columns=list('ABCD'))
out:
A B C D
a 1.235823 -0.767938 -0.750474 0.342353
b 0.506219 0.388180 0.400716 0.207014
c -0.813548 0.509618 0.311099 -0.645569
d -0.510755 -0.195760 1.162505 -2.125746
e -0.559745 -0.937668 0.363403 0.554602
f -1.512407 0.865061 -0.602054 0.207695 df1.loc[['a','b','e'],:]
out:
A B C D
a 1.235823 -0.767938 -0.750474 0.342353
b 0.506219 0.388180 0.400716 0.207014
e -0.559745 -0.937668 0.363403 0.554602

使用标签获取行(等效于df.xs('a'))

df1.loc['a']

out:
A 1.235823
B -0.767938
C -0.750474
D 0.342353
Name: a, dtype: float64

获取带有布尔数组的值

df1.loc['a'] > 0

out:
A True
B False
C False
D True
Name: a, dtype: bool

显示获取值.loc['行标签','列标签']

df1.loc['a','A']

out:
1.2358232787452161

4、基于索引的选择

.iloc属性可以获得纯粹基于整数的索引。语义准讯python和numpy切片,包括起始便捷,不包括结束边界。

如果使用的索引是非整数,即使是有效的便签也会参数IndexError。

以下是.iloc属性的有效输入

  • 整数,例如7
  • 整数列表或者数组,例如[4,2,0]
  • 整数的切片(slice)对象,例如1::7
  • 一个布尔数组
  • 一个callable
s2 = pd.Series(np.random.randn(5),index=list(range(0,10,2)))
out:
0 -1.051477
2 -0.495461
4 2.417686
6 0.329432
8 1.479104
dtype: float64 s2.iloc[:3]
out:
0 -1.051477
2 -0.495461
4 2.417686
6 0.000000
8 1.479104
dtype: float64 s2.iloc[3] = 0 #还可以使用iloc来修改一个的value
out:
0 -1.051477
2 -0.495461
4 2.417686
6 0.000000
8 1.479104
dtype: float64 s2.iloc[:3] = 0 #还是使用iloc连续赋值
out:
0 0.000000
2 0.000000
4 0.000000
6 0.000000
8 1.479104
dtype: float64

使用在DataFrame

df2 = pd.DataFrame(np.random.randn(6,4),
index=list(range(0,12,2)),
columns=list(range(0,8,2)))
out:
0 2 4 6
0 -0.708809 -0.417166 -1.296387 0.620899
2 -1.514339 1.145004 0.877585 -1.695285
4 1.365427 -0.721800 -0.719877 -0.418820
6 0.980937 0.230571 -0.783681 -0.985872
8 1.031649 -1.232232 0.795309 1.294055
10 0.618609 -1.370898 0.229622 0.817530

通过整数切片进行选择

df2.iloc[:3]
out:
0 2 4 6
0 -0.708809 -0.417166 -1.296387 0.620899
2 -1.514339 1.145004 0.877585 -1.695285
4 1.365427 -0.721800 -0.719877 -0.418820

通过整数列表进行选择

df2.iloc[[1,3,5],[1,3]]
out:
2 6
2 1.145004 -1.695285
6 0.230571 -0.985872
10 -1.370898 0.817530 df2.iloc[1:3,:] #df2.iloc[:,1:3]
out:
0 2 4 6
2 -1.514339 1.145004 0.877585 -1.695285
4 1.365427 -0.721800 -0.719877 -0.418820

还可以获得值 .loc['行位置','列位置']

df2.iloc[0,1]
out:
-0.41716586227691288

获取整数位置的行(等于df.xs(1))

df2.iloc[1]
out:
0 -1.514339
2 1.145004
4 0.877585
6 -1.695285
Name: 2, dtype: float64

超出范围的切片索引,会像python、numpy一样优雅的处理(pandas v0.14.0之前并不能这样,否则可能会导致返回一个空的DataFrame)

df2.iloc[:3,:1000]
out:
0 2 4 6
0 -0.708809 -0.417166 -1.296387 0.620899
2 -1.514339 1.145004 0.877585 -1.695285
4 1.365427 -0.721800 -0.719877 -0.418820

超出范围的单个索引器将生成IndexError(并不能像切片那样优雅地处理)。任何元素超出边界的索引器列表将生成IndexError

df2.iloc[[1,2,8]]
IndexError: positional indexers are out-of-bounds

。。。。有一个重要的是,不要把里面的iloc里面的范围值当做是索引,他表示从0开始的第几个。。。。

5、通过布尔索引选择数据

使用单个列的值条件来选择数据

df1[df1.A>0]
out:
A B C D
a 1.235823 -0.767938 -0.750474 0.342353
b 0.506219 0.388180 0.400716 0.207014

使用where的方法来获取数据

df2[df2>0]
out:
0 2 4 6
0 NaN NaN NaN 0.620899
2 NaN 1.145004 0.877585 NaN
4 1.365427 NaN NaN NaN
6 0.980937 0.230571 NaN NaN
8 1.031649 NaN 0.795309 1.294055
10 0.618609 NaN 0.229622 0.817530

使用isin()方法进行过滤

df3 = df2.copy()
df3['E'] = ['one','one','two','three','four','three']
df3[df3['E'].isin(['two','four'])]
out:
0 2 4 6 E
4 1.365427 -0.721800 -0.719877 -0.418820 two
8 1.031649 -1.232232 0.795309 1.294055 four

五、设置数据

添加新列会自动按照索引对齐数据

s3 = pd.Series([1,2,3,4,5,6],index=pd.date_range('20170125',periods=6))
out:
2017-01-25 1
2017-01-26 2
2017-01-27 3
2017-01-28 4
2017-01-29 5
2017-01-30 6
Freq: D, dtype: int64 df3['F'] = s3
out:
0 2 4 6 F
0 -0.708809 -0.417166 -1.296387 0.620899 NaN
2 -1.514339 1.145004 0.877585 -1.695285 NaN
4 1.365427 -0.721800 -0.719877 -0.418820 NaN

按标签设置值

dates = pd.date_range('20180101',periods=6)
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD'))
df.at[dates[0],'A'] = 0

按位置设置值

df.iat[0,1] = 0

通过分配numpy数组进行设置

df.loc[:,'D'] = np.array([5] * len(df)) #这里新增一个D列

结果:

			A			B			C			D
2018-01-01 0.000000 0.000000 -0.312618 5
2018-01-02 -0.774510 -0.322384 0.396792 5
2018-01-03 -0.696162 0.603657 0.581143 5
2018-01-04 1.301474 1.053966 -1.172106 5
2018-01-05 0.619973 1.181660 1.153085 5
2018-01-06 -0.213277 1.306106 1.008972 5

使用where的方法进行操作和设置

df2  = df.copy()
df2[df2 > 0] = -df2
out:
A B C D
2018-01-01 0.000000 0.000000 -0.312618 -5
2018-01-02 -0.774510 -0.322384 -0.396792 -5
2018-01-03 -0.696162 -0.603657 -0.581143 -5
2018-01-04 -1.301474 -1.053966 -1.172106 -5
2018-01-05 -0.619973 -1.181660 -1.153085 -5
2018-01-06 -0.213277 -1.306106 -1.008972 -5

补充删除行列的方法

#删除列
del df['E'] #删除'E'列
e = df.pop('E') #删除并返回E列
e = df.drop(['E'],axis=1,inplace=True) #删除E列并返回,是否在原数据中删除取决于参数inplace。axis=0可删除行
#删除行
e = df.drop([2,5]) #删除索引中2-5列,如果指定参数inplace则在原数据中相应行也被删除

六、丢失数据的处理

pandas主要使用np.nan来表示缺失的数据(NaN == Not a Number)。在计算中是默认不包括缺失值的。。

在内部使用NaN表示丢失数据的选择在很大程度上是出于简单性和性能原因。

df3 = df.reindex(index=dates[0:4],columns=list(df.columns) + ['E']) #新增E列
out:
A B C D E
2018-01-01 0.000000 0.000000 -0.312618 5 NaN
2018-01-02 -0.774510 -0.322384 0.396792 5 NaN
2018-01-03 -0.696162 0.603657 0.581143 5 NaN
2018-01-04 1.301474 1.053966 -1.172106 5 NaN
df3.loc[dates[0]:dates[1],'E'] = 1 #对前两行的E列进行赋值
out:
A B C D E
2018-01-01 0.000000 0.000000 -0.312618 5 1.0
2018-01-02 -0.774510 -0.322384 0.396792 5 1.0
2018-01-03 -0.696162 0.603657 0.581143 5 NaN
2018-01-04 1.301474 1.053966 -1.172106 5 NaN

删除任何含有确实数据的行

df3.dropna(how='any') #使用dropna方法删除任何含有缺少数据的行,并返回一个副本
out:
A B C D E
2018-01-01 0.00000 0.000000 -0.312618 5 1.0
2018-01-02 -0.77451 -0.322384 0.396792 5 1.0 df3.fillna(value=5) #使用fillna方法填充确实的值,并返回一个副本
out:
A B C D E
2018-01-01 0.000000 0.000000 -0.312618 5 1.0
2018-01-02 -0.774510 -0.322384 0.396792 5 1.0
2018-01-03 -0.696162 0.603657 0.581143 5 5.0
2018-01-04 1.301474 1.053966 -1.172106 5 5.0

判断是否有空,返回布尔值

df3.isnull() #获取值为nan的布尔值,等同于pd.isnull(df3),与.notnull()相反。注意,不能使用==比较,否则返回的都是False
out:
A B C D E
2018-01-01 False False False False False
2018-01-02 False False False False False
2018-01-03 False False False False True
2018-01-04 False False False False True

未完待续...

十分钟(小时)学习pandas的更多相关文章

  1. 十分钟搞定pandas内容

    目录 十分钟搞定pandas 一.创建对象 二.查看数据 三.选择器 十二.导入和保存数据 参考:http://pandas.pydata.org/pandas-docs/stable/whatsne ...

  2. 【原】十分钟搞定pandas

    http://www.cnblogs.com/chaosimple/p/4153083.html 本文是对pandas官方网站上<10 Minutes to pandas>的一个简单的翻译 ...

  3. 十分钟搞定 pandas

    原文:http://pandas.pydata.org/pandas-docs/stable/10min.html 译者:ChaoSimple 校对:飞龙 官方网站上<10 Minutes to ...

  4. 十分钟搞定pandas

    转至:http://www.cnblogs.com/chaosimple/p/4153083.html 本文是对pandas官方网站上<10 Minutes to pandas>的一个简单 ...

  5. 【Python笔记】十分钟搞定pandas

    本文是对pandas官方网站上<10 Minutes to pandas>的一个简单的翻译,原文在这里.这篇文章是对pandas的一个简单的介绍,详细的介绍请参考:Cookbook .习惯 ...

  6. 【转】十分钟搞定pandas

    原文链接:http://www.cnblogs.com/chaosimple/p/4153083.html 关于pandas的入门介绍,比较全,也比较实在,特此记录~ 还有关于某同学的pandas学习 ...

  7. Redis数据类型简介(十分钟快速学习Redis)

    如何在ubuntu18.04上安装和保护redis 如何连接到Redis数据库 如何管理Redis数据库和Keys 如何在Redis中管理副本和客户端 如何在Redis中管理字符串 如何在Redis中 ...

  8. 工作流Activiti的学习总结(十二) activiti官方十分钟快速学习 (zhuan)

    http://topmanopensource.iteye.com/blog/1315341 ***************************************************** ...

  9. 十分钟掌握Pandas(上)——来自官网API

    十分钟掌握Pandas(上)——来自官网API 其实不止10分钟,这么多,至少一天 一.numpy和pandas numpy是矩阵计算库,pandas是数据分析库,关于百度百科,有对pandas的介绍 ...

随机推荐

  1. 【面试篇】资深招聘HR有哪些面试技巧?

    15年资深招聘HR总结的面试技巧     1.做一下自我介绍 了解应聘者的基本信息和工作经历 2.以往工作中您的职责是什么? 了解应聘者的相关工作经验和其系统性全面性 3.请讲一下您以往的工作经历. ...

  2. 最快效率求出乱序数组中第k小的数

    题目:以尽量高的效率求出一个乱序数组中按数值顺序的第k 的元素值 思路:这里很容易想到直接排序然后顺序查找,可以使用效率较高的快排,但是它的时间复杂度是O(nlgn),我们这里可以用一种简便的方法,不 ...

  3. JAVA四类八种基本数据类型

    boolean类型 Boolean在内存中占用一个字节. 当java编译器把java源代码编译为字节码时,会用int或byte来表示boolean.在java虚拟机中,用整数零来表示false,用任意 ...

  4. [Swift]LeetCode932. 漂亮数组 | Beautiful Array

    For some fixed N, an array A is beautiful if it is a permutation of the integers 1, 2, ..., N, such ...

  5. Identity Server 4 中文文档(v1.0.0) 目录

    欢迎来到IdentityServer4 第一部分 简介 第1章 背景 第2章 术语 第3章 支持和规范 第4章 打包和构建 第5章 支持和咨询选项 第6章 演示服务器和测试 第7章 贡献 第二部分 快 ...

  6. Java接口实现传参

    package com.gezhi.interfaces;/** * 新建一个dog类实现接口livingable(狗吃和上厕所都是与生俱来的不应该写成接口) * @author square 凉 * ...

  7. AutoFac - 将 autofac 应用于MVC多层项目

    一.前言 AutoFac是.NET平台下的一款著名的IoC Container,它可以让我们很轻松的解除项目中服务类的接口与客户类的接口实现类之间的依赖关系,从而降低系统各模块之间耦合程度以提高系统的 ...

  8. Python爬虫入门教程 26-100 知乎文章图片爬取器之二

    1. 知乎文章图片爬取器之二博客背景 昨天写了知乎文章图片爬取器的一部分代码,针对知乎问题的答案json进行了数据抓取,博客中出现了部分写死的内容,今天把那部分信息调整完毕,并且将图片下载完善到代码中 ...

  9. 有道云笔记 - Markdown模板(文首附markdown源码,即.md文件)

    有道云笔记 - Markdown模板 附 本文的Markdown源码镜像: https://github.com/yanglr/AlgoSolutions/blob/master/Youdao_Not ...

  10. Android--MP3播放器MediaPlayer

    前言 Android提供了常见的音频.视频的编码.解码机制.借助于多媒体类MediaPlayer的支持,开发人员可以很方便在在应用中播放音频.视频.本篇博客主要讲解在Android平台下如何播放一个音 ...