十分钟入门pandas(上)【解读pandas官方文档】

浏览: 11173

前言

其实,学习Python很好的方法是去看官方文档。

有人会说,我零基础,看不懂啊!

也有人会说,我英语差,看不懂啊!!

还有人会说,我想学实战案例,不想看的这么详细!!!


是的,官方文档说的面面俱到,像是查字典似的,对于初学者是很不友善的

所以大部分人选择了:拒绝!

其实,我以前也是不看官方文档的,但有些问题百度不到,看的书里没讲到,那我就被迫去看官方文档了

此举给我打开了学习Python的一扇窗

我发现,官方文档其实有很多例子和入门学习内容,比如我们今天要说的

十分钟入门Pandas

很多人讨厌看官方文档,今天我就用中文简单解读一下,争取让大家看懂,能入门Pandas

官方文档说想要详细了解Pandas的更多用法可以看它的cookbook:http://pandas.pydata.org/pandas-docs/stable/cookbook.html#cookbook

导入模块

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

这分别导入了pandas、numpy包 和 matplotlib 包中的 pyplot 模块 

创建对象

请参见“数据结构简介”部分:http://pandas.pydata.org/pandas-docs/version/0.20/dsintro.html#dsintro

通过一个列表的值创建一个系列,让pandas创建一个默认的整数索引:

s = pd.Series([1,3,5,np.nan,6,8])
s

Clipboard Image.png

注意:np.nan表示不存在

通过numpy创建的数组,可以创建一个pandas中特有的dataframe,使用datetime作为索引和标记列名。

dates = pd.date_range('20130101', periods=6)

dates

Clipboard Image.png

这里的date_range()是pandas下的一个方法,可以在jupyter notebook下使用如下方法查看使用说明:

?pd.date_range()

Clipboard Image.png


我们可以看到这个方法的使用说明和各个参数的作用

看到这个方法是返回固定频率日期时间索引,返回连续的六个日期信息

df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
df

Clipboard Image.png

?np.random.randn()

np.random.randn(6,4)是生成6行4列的标准正态分布数据

注:这里使用ABCD为列标签,之前生成的日期序列为行标签,6行4列标准正态分布数据为内容的dataframe


使用字典来创建dataframe

df2 = pd.DataFrame({ 'A' : 1.,
'B' : pd.Timestamp('20130102'),
'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' : 'foo' })
df2

Clipboard Image.png


查看dataframe的类型信息

df2.dtypes

Clipboard Image.png

查看数据

更多内容请参阅基础部分:http://pandas.pydata.org/pandas-docs/version/0.20/basics.html#basics

查看dataframe顶部和底部的行(默认五行)

df.head()#查看默认前五行

Clipboard Image.png

df.tail()#查看默认后五行

Clipboard Image.png

df.head(3)#查看前三行

Clipboard Image.png

显示索引,列和底层numpy数据

显示索引:

df.index

Clipboard Image.png

显示列名:

df.columns

Clipboard Image.png


查看底层numpy数据:

df.values

Clipboard Image.png


对数据的描述性统计信息

df.describe()

Clipboard Image.png

注意:数据需要是数字类型(float,int等)


转置调换数据

df.T

Clipboard Image.png

注意:就像线性代数里面的转置矩阵


按轴排序

df.sort_index(axis=1, ascending=False)

Clipboard Image.png

可能你还看不太明白这是什么方法

我们help一下

Clipboard Image.png


这说明axis可以取0或者1,我们试试看0:

df.sort_index(axis=0, ascending=False)

Clipboard Image.png

可以看出两者的区别

深入挖掘其中的参数作用还得你自己慢慢看呢


按值排序

df.sort_values(by='B')

Clipboard Image.png

这是B列数据排序,并且其他数据参照B列数据变化。

选择数据

更多内容请参阅索引文档索引:http://pandas.pydata.org/pandas-docs/version/0.20/indexing.html#indexing

和选择数据和多指标/高级索引:http://pandas.pydata.org/pandas-docs/version/0.20/advanced.html#advanced


选择一个列,返回一个Series,相当于df.A

df['A'] #取A列数据,返回的是一个序列

Clipboard Image.png


选择通过[],切片出行数据

df[0:3] #使用默认索引取出前三行

Clipboard Image.png

df['20130102':'20130104'] #使用新索引取出对应行

Clipboard Image.png


标签选择

在标签选择中查看更多内容:http://pandas.pydata.org/pandas-docs/version/0.20/indexing.html#indexing-label


使用标签获取一块数据:

df.loc[dates[0]] #取出第一行

Clipboard Image.png

通过标签选择多列:

df.loc[:,['A','B']] #这里选择的是A,B列数据

Clipboard Image.png


显示标签切片:

df.loc['20130102':'20130104',['A','B']]

Clipboard Image.png


减少返回对象的维度:

df.loc['20130102',['A','B']]

Clipboard Image.png


获得标量值(就是定位一个具体的值):

df.loc[dates[0],'A']

Clipboard Image.png


快速访问标量(等同于先前的方法):

df.at[dates[0],'A']

Clipboard Image.png

按位置选择

更多按位置选择内容:http://pandas.pydata.org/pandas-docs/version/0.20/indexing.html#indexing-integer

通过传递的整数的位置进行选择:

df.iloc[3] #取出第三行

Clipboard Image.png

通过整数切片,类似于numpy / python:

df.iloc[3:5,0:2]

Clipboard Image.png

切出3-4行,1-2列一块区域

通过整数位置列表切分,类似numpy的/ Python的风格:

df.iloc[[1,2,4],[0,2]]

Clipboard Image.png

切分出某些行:

df.iloc[1:3,:]

Clipboard Image.png


切分出某些列:

df.iloc[:,1:3]

Clipboard Image.png

 获取某个值

df.iloc[1,1]

Clipboard Image.png

快速访问某个值(等同于先前的方法):

df.iat[1,1]

Clipboard Image.png

布尔索引

使用单列值选择数据

df[df.A > 0]

Clipboard Image.png

注意:先判断A栏中大于零的数,然后把这些行取出来

从满足布尔条件的DataFrame中选择值:

df[df > 0]

注:显示dataframe中大于零的数

使用isin()方法进行过滤:

df2 = df.copy()
df2['E'] = ['one', 'one','two','three','four','three']
df2

Clipboard Image.png

注:copy了一份dataframe,然后新加了一列E

?df2.isin()

从help文件可以知道isin()方法的作用是:

DataFrame显示每个元素是否在DataFrame包含在值中,返回boolean.

df2[df2['E'].isin(['two','four'])]

Clipboard Image.png

相当于判断two和four两列是否在df2中,在的话返回True,然后将参数传入df2,返回这两列的值。

设置

置新的列会自动使索引对齐数据:

s1 = pd.Series([1,2,3,4,5,6], index=pd.date_range('20130102', periods=6))
s1

Clipboard Image.png

df['F'] = s1
df

Clipboard Image.png

这里用和原来一样的索引(时间)为原来的dataframe增加了一列数据


通过使用numpy数组分配进行设置:

df.loc[:,'D'] = np.array([5] * len(df))
df

Clipboard Image.png

注:产生一个数组,每个元素值为5,长度为df的行数,替换在原来df的D列


按位置设定值:

df.iat[0,1] = 0
df

注:将第一行第二列的数值设定为0


设置操作:

df2 = df.copy()
df2[df2 > 0] = -df2
df2

注:将df copy一份命名为df2,然后将df2中大于零的数加负号

Clipboard Image.png


关于十分钟入门pandas下篇尽快写完

参考文献:http://pandas.pydata.org/pandas-docs/version/0.20/10min.html#selection

推荐 6
本文由 ID王大伟 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

4 个评论

标题可以,内容更可以
赞,会加油学习的
厉害了,佩服
谢谢

要回复文章请先登录注册