• 十分钟(小时)学习pandas


    十分钟学习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
    
    

    未完待续...

  • 相关阅读:
    什么是枚举?有什么作用?有什么好处?
    java获取某个范围内的一个随机数
    java中普通代码块,构造代码块,静态代码块的区别及代码示例
    Oracle数据库迁移
    linux下修改文件权限
    <%@ include file="">和<jsp:include file="">区别
    JAVA常见异常解析
    jdk环境变量配置
    jstl中fmt标签详解
    jsp脚本元素
  • 原文地址:https://www.cnblogs.com/luhuan/p/8343654.html
Copyright © 2020-2023  润新知