阅读更多

Python数据处理的瑞士军刀:pandas

第二篇:快速进阶

在上一篇中我们介绍了如何创建并访问pandas的Series和DataFrame类型的数据,本篇将介绍如何对pandas数据进行操作,掌握这些操作之后,基本可以处理大多数的数据了。首先,导入本篇中使用到的模块:

 
 
 
 
 
1
import numpy as np
2
import pandas as pd
3
from pandas import Series, DataFrame
 
 

为了看数据方便一些,我们设置一下输出屏幕的宽度

 
 
 
 
 
1
pd.set_option('display.width', 200)
 
 

一、数据创建的其他方式

数据结构的创建不止是上篇中介绍的标准形式,本篇再介绍几种。例如,我们可以创建一个以日期为元素的Series:

 
 
 
 
 
1
dates = pd.date_range('20150101', periods=5)
2
print dates
 
 
<class 'pandas.tseries.index.DatetimeIndex'> [2015-01-01, ..., 2015-01-05] Length: 5, Freq: D, Timezone: None
 

将这个日期Series作为索引赋给一个DataFrame:

 
 
 
 
 
1
df = pd.DataFrame(np.random.randn(5, 4),index=dates,columns=list('ABCD'))
2
print df
 
 
A B C D 2015-01-01 -0.168870 0.191945 -0.906788 -1.295211 2015-01-02 -0.985849 0.312378 -1.513870 -0.876869 2015-01-03 -0.241945 1.437763 0.209494 0.061032 2015-01-04 0.139199 0.124118 -0.204801 -1.745327 2015-01-05 0.243644 -0.373126 0.333583 2.640955
 

只要是能转换成Series的对象,都可以用于创建DataFrame:

 
 
 
 
 
1
df2 = pd.DataFrame({ 'A' : 1., 'B': pd.Timestamp('20150214'), 'C': pd.Series(1.6,index=list(range(4)),dtype='float64'), 'D' : np.array([4] * 4, dtype='int64'), 'E' : 'hello pandas!' })
2
print df2
 
 
A B C D E 0 1 2015-02-14 1.6 4 hello pandas! 1 1 2015-02-14 1.6 4 hello pandas! 2 1 2015-02-14 1.6 4 hello pandas! 3 1 2015-02-14 1.6 4 hello pandas!
 

二、数据的查看

在多数情况下,数据并不由分析数据的人员生成,而是通过数据接口、外部文件或者其他方式获取。这里我们通过量化实验室的数据接口获取一份数据作为示例:

 
 
 
 
 
1
stock_list = ['000001.XSHE', '000002.XSHE', '000568.XSHE', '000625.XSHE', '000768.XSHE', '600028.XSHG', '600030.XSHG', '601111.XSHG', '601390.XSHG', '601998.XSHG']
2
raw_data = DataAPI.MktEqudGet(secID=stock_list, beginDate='20150101', endDate='20150131', pandas='1')
3
df = raw_data[['secID', 'tradeDate', 'secShortName', 'openPrice', 'highestPrice', 'lowestPrice', 'closePrice', 'turnoverVol']]
 
 

以上代码获取了2015年一月份全部的交易日内十支股票的日行情信息,首先我们来看一下数据的大小:

 
 
 
 
 
1
print df.shape
 
 
(200, 8)
 

我们可以看到有200行,表示我们获取到了200条记录,每条记录有8个字段,现在预览一下数据,dataframe.head()和dataframe.tail()可以查看数据的头五行和尾五行,若需要改变行数,可在括号内指定:

 
 
 
 
 
1
print "Head of this DataFrame:"
2
print df.head()
3
print "Tail of this DataFrame:"
4
print df.tail(3)
 
 
Head of this DataFrame:
secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 0 000001.XSHE 2015-01-05 平安银行 15.99 16.28 15.60 16.02 286043643 1 000001.XSHE 2015-01-06 平安银行 15.85 16.39 15.55 15.78 216642140 2 000001.XSHE 2015-01-07 平安银行 15.56 15.83 15.30 15.48 170012067 3 000001.XSHE 2015-01-08 平安银行 15.50 15.57 14.90 14.96 140771421 4 000001.XSHE 2015-01-09 平安银行 14.90 15.87 14.71 15.08 250850023 Tail of this DataFrame: secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 197 601998.XSHG 2015-01-28 中信银行 7.04 7.32 6.95 7.15 163146128 198 601998.XSHG 2015-01-29 中信银行 6.97 7.05 6.90 7.01 93003445 199 601998.XSHG 2015-01-30 中信银行 7.10 7.14 6.92 6.95 68146718

dataframe.describe()提供了DataFrame中纯数值数据的统计信息:

 
 
 
 
 
1
print df.describe()
 
 
openPrice highestPrice lowestPrice closePrice turnoverVol count 200.00000 200.000000 200.00000 200.000000 2.000000e+02 mean 15.17095 15.634000 14.86545 15.242750 2.384811e+08 std 7.72807 7.997345 7.56136 7.772184 2.330510e+08 min 6.14000 6.170000 6.02000 6.030000 1.242183e+07 25% 8.09500 8.250000 7.98750 8.127500 7.357002e+07 50% 13.96000 14.335000 13.75500 13.925000 1.554569e+08 75% 19.95000 20.500000 19.46250 20.012500 3.358617e+08 max 36.40000 37.250000 34.68000 36.150000 1.310855e+09
 

对数据的排序将便利我们观察数据,DataFrame提供了两种形式的排序。一种是按行列排序,即按照索引(行名)或者列名进行排序,可调用dataframe.sort_index,指定axis=0表示按索引(行名)排序,axis=1表示按列名排序,并可指定升序或者降序:

 
 
 
 
 
1
print "Order by column names, descending:"
2
print df.sort_index(axis=1, ascending=False).head()
 
 
Order by column names, descending:
turnoverVol tradeDate secShortName secID openPrice lowestPrice highestPrice closePrice 0 286043643 2015-01-05 平安银行 000001.XSHE 15.99 15.60 16.28 16.02 1 216642140 2015-01-06 平安银行 000001.XSHE 15.85 15.55 16.39 15.78 2 170012067 2015-01-07 平安银行 000001.XSHE 15.56 15.30 15.83 15.48 3 140771421 2015-01-08 平安银行 000001.XSHE 15.50 14.90 15.57 14.96 4 250850023 2015-01-09 平安银行 000001.XSHE 14.90 14.71 15.87 15.08

第二种排序是按值排序,可指定列名和排序方式,默认的是升序排序:

 
 
 
 
 
1
print "Order by column value, ascending:"
2
print df.sort(columns='tradeDate').head()
3
print "Order by multiple columns value:"
4
df = df.sort(columns=['tradeDate', 'secID'], ascending=[False, True])
5
print df.head()
 
 
Order by column value, ascending:
secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 0 000001.XSHE 2015-01-05 平安银行 15.99 16.28 15.60 16.02 286043643 20 000002.XSHE 2015-01-05 万科A 14.39 15.29 14.22 14.91 656083570 40 000568.XSHE 2015-01-05 泸州老窖 20.50 21.99 20.32 21.90 59304755 60 000625.XSHE 2015-01-05 长安汽车 16.40 18.07 16.32 18.07 82087982 80 000768.XSHE 2015-01-05 中航飞机 18.76 19.88 18.41 19.33 84199357 Order by multiple columns value: secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 19 000001.XSHE 2015-01-30 平安银行 13.93 14.12 13.76 13.93 93011669 39 000002.XSHE 2015-01-30 万科A 13.09 13.49 12.80 13.12 209624706 59 000568.XSHE 2015-01-30 泸州老窖 19.15 19.51 19.11 19.12 14177179 79 000625.XSHE 2015-01-30 长安汽车 19.16 19.45 18.92 19.18 21233495 99 000768.XSHE 2015-01-30 中航飞机 25.38 25.65 24.28 24.60 59550293

三、数据的访问和操作

3.1 再谈数据的访问

上篇中已经介绍了使用loc、iloc、at、iat、ix以及[]访问DataFrame数据的几种方式,这里再介绍一种方法,使用":"来获取部行或者全部列:

 
 
 
 
 
1
print df.iloc[1:4][:]
 
 
secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 39 000002.XSHE 2015-01-30 万科A 13.09 13.49 12.80 13.12 209624706 59 000568.XSHE 2015-01-30 泸州老窖 19.15 19.51 19.11 19.12 14177179 79 000625.XSHE 2015-01-30 长安汽车 19.16 19.45 18.92 19.18 21233495
 

我们可以扩展上篇介绍的使用布尔类型的向量获取数据的方法,可以很方便地过滤数据,例如,我们要选出收盘价在均值以上的数据:

 
 
 
 
 
1
print df[df.closePrice > df.closePrice.mean()].head()
 
 
secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 59 000568.XSHE 2015-01-30 泸州老窖 19.15 19.51 19.11 19.12 14177179 79 000625.XSHE 2015-01-30 长安汽车 19.16 19.45 18.92 19.18 21233495 99 000768.XSHE 2015-01-30 中航飞机 25.38 25.65 24.28 24.60 59550293 139 600030.XSHG 2015-01-30 中信证券 28.50 28.72 27.78 27.86 304218245 58 000568.XSHE 2015-01-29 泸州老窖 19.04 19.23 19.00 19.15 12421826
 

isin()函数可方便地过滤DataFrame中的数据:

 
 
 
 
 
1
print df[df['secID'].isin(['601628.XSHG', '000001.XSHE', '600030.XSHG'])].head()
2
print df.shape
 
 
secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 19 000001.XSHE 2015-01-30 平安银行 13.93 14.12 13.76 13.93 93011669 139 600030.XSHG 2015-01-30 中信证券 28.50 28.72 27.78 27.86 304218245 18 000001.XSHE 2015-01-29 平安银行 13.82 14.01 13.75 13.90 101675329 138 600030.XSHG 2015-01-29 中信证券 28.10 28.58 27.81 28.18 386310957 17 000001.XSHE 2015-01-28 平安银行 13.87 14.30 13.80 14.06 124087755
(200, 8)
3.2 处理缺失数据

在访问数据的基础上,我们可以更改数据,例如,修改某些元素为缺失值:

 
 
 
 
 
1
df['openPrice'][df['secID'] == '000001.XSHE'] = np.nan
2
df['highestPrice'][df['secID'] == '601111.XSHG'] = np.nan
3
df['lowestPrice'][df['secID'] == '601111.XSHG'] = np.nan
4
df['closePrice'][df['secID'] == '000002.XSHE'] = np.nan
5
df['turnoverVol'][df['secID'] == '601111.XSHG'] = np.nan
6
print df.head(10)
 
 
secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 19 000001.XSHE 2015-01-30 平安银行 NaN 14.12 13.76 13.93 93011669 39 000002.XSHE 2015-01-30 万科A 13.09 13.49 12.80 NaN 209624706 59 000568.XSHE 2015-01-30 泸州老窖 19.15 19.51 19.11 19.12 14177179 79 000625.XSHE 2015-01-30 长安汽车 19.16 19.45 18.92 19.18 21233495 99 000768.XSHE 2015-01-30 中航飞机 25.38 25.65 24.28 24.60 59550293 119 600028.XSHG 2015-01-30 中国石化 6.14 6.17 6.02 6.03 502445638 139 600030.XSHG 2015-01-30 中信证券 28.50 28.72 27.78 27.86 304218245 159 601111.XSHG 2015-01-30 中国国航 7.92 NaN NaN 7.69 NaN 179 601390.XSHG 2015-01-30 中国中铁 8.69 8.69 8.12 8.14 352357431 199 601998.XSHG 2015-01-30 中信银行 7.10 7.14 6.92 6.95 68146718
 

原始数据的中很可能存在一些数据的缺失,就如同现在处理的这个样例数据一样,处理缺失数据有多种方式。通常使用dataframe.dropna(),dataframe.dropna()可以按行丢弃带有nan的数据;若指定how='all'(默认是'any'),则只在整行全部是nan时丢弃数据;若指定thresh,则表示当某行数据非缺失列数超过指定数值时才保留;要指定根据某列丢弃可以通过subset完成。

 
 
 
 
 
1
print "Data size before filtering:"
2
print df.shape
3
4
print "Drop all rows that have any NaN values:"
5
print "Da
    
来自: q.datayes.com
0
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • .net高级技术——Attribute

    什么是Attribute?Attribute有什么用? Attribute相当于标签,比如说我们在即将拆迁的房子上会画一个拆字,还比如说被查封的公司会有一个封条!这些都是标签。那么在C#中的标签是什么样子的呢? 常见的Attribute有:[Obsolete]、 在使用一些窗体控价的时候可以使用[ReadOnly]、[DisplayName]等等! 以后在很多框架里面还会有很多的Attri...

  • Attribute在.NET编程的应用(六)

    Attribute在.NET编程的应用(六)(承上节) .NET Framework拦截机制的设计中,在客户端和对象之间,存在着多种消息接收器,这些消息接收器组成一个链表,客户端的调用对象的过程以及调用返回实行拦截,你可以定制自己的消息接收器,把它们插入了到链表中,来完成你对一个调用的前处理和后处理。那么调用拦截是如何构架或者说如何实现的呢?在.NET中有两种调用,一种是跨应用域(App

  • .net基础扫盲-Attribute

    在我刚接触的项目中,在实体层见得最多的就是上图中标识出的东西,主要是由它完成了ORM,具体怎么实现的还不太清楚,但肯定和它的关系有很大,所以先去了解一下它,以便之后解开实现过程的真面纱!     首先,图中标记出的是Attribute类的自定义用法。一般Attribute的是这么使用的: 第一,先自定义一个Attribute类;     这里我们自定义一个developerattribute

  • .Net6中4大过滤器的使用方法及应用场景

    IAuthorizationFilter授权过滤器 public class CtmAuthorizationFilterAttribute : Attribute, IAuthorizationFilter { public void OnAuthorization(AuthorizationFilterContext context) { // context.HttpContext.User.Claims context.Http...

  • (八).net之特性Attribute声明、使用、验证

    特性Attribute 特性:是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方括号([ ])来描述的。 特性(Attribute)用于添加元数据,如编译器指令和注释、描述、方法、类等其他信息。.Net 框架提供了两种类型的特性:预定义特性和自定义特性。

  • 100天精通Python(数据分析篇)——第75天:Pandas数据预处理之数据标准化

    专栏导读 1. 数据标准化是什么? 2. 数据标准化的作用 3. 数据标准化的方法 4. 离差标准化 5. 标准差标准化 6. 小数定标标准化

  • 100天精通Python(数据分析篇)——第53天:初始pandas模块基础

    一、初始pandas 1. 什么是pandas? 2. 为什么要学习pandas? 3. pandas的优势 4. 下载安装pandas 二、Pandas的数据类型 1. Series 2. DataFrame

  • 100天精通Python(数据分析篇)——第63天:Pandas使用自定义函数案例(pipe、apply、map、applymap、agg)

    一、Pandas自定义函数 1. pipe() 2. apply() 3. map() 4. applymap() 5. agg() 二、总结

  • 【Pandas数据处理100例目录】Python数据分析玩转Excel表格数据

    大家好,我是阿光。本专栏整理了《Pandas数据分析处理》,内包含了各种常见的数据处理,以及Pandas内置函数的使用方法,帮助我们快速便捷的处理表格数据。正在更新中~ ✨。

  • Python数据处理035:结构化数据分析工具Pandas之Pandas概览

    Python结构化数据分析工具Pandas之Pandas概览

  • .Net中的Attribute

    Net中有Attribute和Property, 中文翻译都是属性,但是它们又非常不同。 常常把Attribute叫做特性以区分。 Attribute的作用: Attribute类似于标签, 可以为类,方法,结构体,属性,委托等贴上标签,在以后的实际执行时候,根据不同的标签做不同的处理。 Attribute的几个特点 1. Attribute也是一个类...

  • .NET 6 攻略大全(三)

    点击上方蓝字关注我们(本文阅读时间:15分钟).NET 6 继续与大家相约周日啦。本篇文章将介绍:单文件应用、IL 修整、System.Text.Json、源代码构建、库AIP的相关攻略。单文件应用在 .NET 6中,已为 Windows 和 macOS 启用内存中单文件应用程序。在 .NET 5 中,这种部署类型仅限于 Linux。您现在可以为所有受支持的操作系统发...

  • C#中的Attribute详解(下)

    从上篇里我们可以看到,Attribute似乎总跟public、static这些关键字(Keyword)出现在一起。莫非使用了Attribute就相当于定义了新的修饰符(Modifier)吗?让我们一窥究竟吧!

  • .Net 特性(Attribute)

    特性Attribute,和注释有什么区别 注释:是让人看的懂代码,不影响程序的运行,和编译器 特性:特性可以影响编译器,特性可以影响程序的运行,特性编译后生成的是一个metadata [Obsolete(请不要用这个了,请使用什么来代替,true)] //过时了 [Serializable] //可以序列化和反序列化 声明和使用attribute,AttributeUsage 声...

  • .NET6新东西--CallerArgumentExpression

    在.NET6中我们可以使用CallerArgumentExpression很方便的获取调用方的信息,它可以帮助开发人员简化很多代码,让代码更加简洁。下面我们就来讲解一下吧。 其实在很早.NET就支持自动获取调用方的信息了,在.NET6以前我们如果要获取调用方的信息可以使用这三个Caller Info Attribute: CallerMemberName:调用方名称,方法名或者属性名; CallerFilePath:调用方源代码的位置; CallerLineNumber:调用方位于源代码的第几行。 具体

  • Python每日一练(数据分析篇)——第37天:数据清洗

    Python每日一练(数据分析篇)——第37天:数据清洗

  • 27000字,103天,16篇:深入浅出Pandas数据分析

    从4月24号的第一篇Pandas文章:《一切从爆炸函数开始》,到昨天8月5号的《图解Pandas的轴旋转函数:stack和unstack》,总共历时103天,让Pandas来见证吧: 两行代码告诉你两个日期之间的时间差,这就是Pandas???? ...

  • 【Python数据分析 - 11】:DataFrame索引操作(pandas篇)

    文章目录 DataFrame索引操作 数据准备 重置索引 - reset_index() 构建一个DataFrame 设置其他列为索引 - set_index() 设置多个索引 修改列索引名 方法一:直接修改 - columns 方法二:rename方法 rename修改行索引名...

  • python数据处理中Pandas数据处理及分析----超详细

    假设现在有一组自行车行驶数据,这组数据记录的是蒙特利尔市内7条自行车道的自行车骑行人数,下面用python中的pandas对其进行分析。#此直方图为所有车道的骑行人数直方图。

  • 100天精通Python(数据分析篇)——第58天:Pandas读写数据库(read_sql、to_sql参数说明+代码实战)

    100天精通Python(数据分析篇)——第58天:Pandas读写数据库(read_sql、to_sql) 一、read_sql() 1. sql 2. con 3. index_col 4. coerce_float 5. params 6. parse_dates 7. columns 8. chunksize 二、...

Global site tag (gtag.js) - Google Analytics