查看原文
其他

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

2017-06-26 王大伟 Python爱好者社区

(点击上方Python爱好者社区,可快速关注)


作者:王大伟

博客专栏:https://www.hellobi.com/u/wangdawei/articles

Python爱好者社区  唯一小编  

(文末有新福利 

前言

其实,学习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


注意:np.nan表示不存在

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

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

dates


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

?pd.date_range()



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

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

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


?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



查看dataframe的类型信息

df2.dtypes


查看数据

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

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

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


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


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


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

显示索引:

df.index


显示列名:

df.columns



查看底层numpy数据:

df.values



对数据的描述性统计信息

df.describe()


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


转置调换数据

df.T


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


按轴排序

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


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

我们help一下



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

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


可以看出两者的区别

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


按值排序

df.sort_values(by='B')


这是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列数据,返回的是一个序列



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

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


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



标签选择

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


使用标签获取一块数据:

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


通过标签选择多列:

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



显示标签切片:

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



减少返回对象的维度:

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



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

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



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

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


按位置选择

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

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

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


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

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


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

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

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


切分出某些行:

df.iloc[1:3,:]



切分出某些列:

df.iloc[:,1:3]


 获取某个值

df.iloc[1,1]


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

df.iat[1,1]


布尔索引

使用单列值选择数据

df[df.A > 0]


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

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

df[df > 0]

注:显示dataframe中大于零的数

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

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


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

?df2.isin()

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

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

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


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

设置

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

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


df['F'] = s1
df


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


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

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


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


按位置设定值:

df.iat[0,1] = 0
df

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


设置操作:

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

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


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

新福利:Kenny 7月11日在Hellobi Live直播 《自然语言处理之-基于深度学习技术的诗歌写作机器人内容:

1、 写诗机器人效果展示

2、 基于深度学习写诗机器人训练数据收集,清洗,导入

3、 诗歌数据预处理,特征化和数值化后转化为可训练的数据

4、 写诗机器人模块介绍

5、 写诗机器人算法介绍

6、 写诗机器人的实现及效果评估

付费参加方式:点击阅读原文报名

免费参加方式:长按下图,关注公众号Python爱好者社区,在菜单栏点击免费听课参加活动

关注公众号,“Python爱好者社区”,回复“爬虫”即可获取崔老师爬虫免费学习视频。


Python爱好者社区


为大家提供与Python相关的最新技术和资讯。


长按指纹 > 识别图中二维码 > 添加关注

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存