博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 数据分析----pandas
阅读量:5048 次
发布时间:2019-06-12

本文共 8067 字,大约阅读时间需要 26 分钟。

pandas是一个强大的Python数据分析的工具包。

pandas是基于NumPy构建的。

pandas的主要功能

  • 具备对其功能的数据结构DataFrame、Series
  • 集成时间序列功能
  • 提供丰富的数学运算和操作 灵活处理缺失数据

安装方法:pip install pandas

引用方法:import pandas as pd

Series:

是带有标签的一维数组,可以保存任何数据类型(整数,字符串,浮点数,Python对象等)。轴标签统称为索引创建Series的基本方法是调用:

s = pd.Series(data, index=index)

data 可以是:

  • Python dict(字典)
  • ndarray
  • 数字

如果data是ndarray,则索引必须与数据长度相同。如果没有传递索引,将创建值为[0, ..., len(data) 1]的索引。

In [125]: import pandas as pdIn [126]: a = pd.Series([4,7,-5,3],index=['a','b','c','d'])In [127]: aOut[127]: a    4b    7c   -5d    3dtype: int64In [130]: b = pd.Series({
'a':1,'b':2})In [131]: bOut[131]: a 1b 2dtype: int64

获取值数组和索引数组:values属性和index属性

In [133]: a.valuesOut[133]: array([ 4,  7, -5,  3])In [134]: a.indexOut[134]: Index(['a', 'b', 'c', 'd'], dtype='object')

Series特性:

  • 从ndarray创建Series:Series(arr)
    In [140]: arr = np.array([1,2,3,4,5]) #必须是一维数组In [141]: a = pd.Series(arr)In [142]: aOut[142]: 0    11    22    33    44    5dtype: int64
  • 与标量运算:sr*2
    In [142]: aOut[142]: 0    11    22    33    44    5dtype: int64In [143]: a*2Out[143]: 0     21     42     63     84    10dtype: int64
  • 两个Series运算:sr1+sr2. 注意索引得一样,否则报NaN错误(not a number)
    In [145]: bOut[145]: a    4b    7c   -5d    3e    0dtype: int64In [146]: aOut[146]: 0    11    22    33    44    5dtype: int64In [147]: b+aOut[147]: a   NaNb   NaNc   NaNd   NaNe   NaN0   NaN1   NaN2   NaN3   NaN4   NaNdtype: float64In [150]: b = pd.Series(np.arange(5))In [151]: aOut[151]: 0    11    22    33    44    5dtype: int64In [152]: bOut[152]: 0    01    12    23    34    4dtype: int64In [153]: a+bOut[153]: 0    11    32    53    74    9dtype: int64
  • 索引:sr[0], sr[[1,2,4]]
    In [157]: bOut[157]: a    4b    7c   -5d    3e    0dtype: int64In [158]: b[0]Out[158]: 4In [159]: b['a']Out[159]: 4
  • 切片:sr[0:2](切片依然是视图形式,浅拷贝)
    In [161]: b[1:3]Out[161]: b    7c   -5dtype: int64In [162]: b['b':'d']Out[162]: b    7c   -5d    3dtype: int64In [163]: b['b':'c']Out[163]: b    7c   -5dtype: int64
  • 通用函数:np.abs(sr)
  • 布尔值过滤:sr[sr>0]
    In [164]: bOut[164]: a    4b    7c   -5d    3e    0dtype: int64In [165]: b[b>3]Out[165]: a    4b    7dtype: int64
  • 统计函数:mean() sum() cumsum()
    In [169]: bOut[169]: a    4b    7c   -5d    3e    0dtype: int64In [170]: b.mean()Out[170]: 1.8In [171]: b.sum()Out[171]: 9In [173]: b.cumsum(). #每个数字与这列之前的数据的和Out[173]: a     4b    11c     6d     9e     9dtype: int64
  • Series支持字典的特性(标签):
    • 从字典创建Series:Series(dic), 
    • in运算:’a’ in sr、for x in sr
    • 键索引:sr['a'], sr[['a', 'b', 'd']]
    • 键切片:sr['a':'c']
    • 其他函数:get('a', default=0)等

整数索引:

如果索引是整数类型,则根据整数进行数据操作时总是面向标签的。

  • loc属性 以标签解释
  • iloc属性 以下标解释 
In [178]: sr = pd.Series(np.arange(4.))In [179]: srOut[179]: 0    0.01    1.02    2.03    3.0dtype: float64In [185]: sr.iloc[0]Out[185]: 0.0In [186]: sr.loc[0]Out[186]: 0.0

Series数据对齐

  pandas在运算时,会按索引进行对齐然后计算。如果存在不同的索引,则结果的索引是两个操作数索引的并集。

  • sr1.add(sr2, fill_value=0)
  • 灵活的算术方法:add, sub, div, mul
In [189]: sr1Out[189]: c    12a    23d    34dtype: int64In [190]: sr2Out[190]: d    11c    20a    10dtype: int64In [191]: sr1+sr2Out[191]: a    33c    32d    45dtype: int64In [192]: sr3 = pd.Series([11,20,10,14], index=['d','c','a','b'])In [193]: sr2+sr3Out[193]: a    20.0b     NaNc    40.0d    22.0dtype: float64In [194]: sr2.add(sr3,fill_value = 0)Out[194]: a    20.0b    14.0c    40.0d    22.0dtype: float64
  • 缺失数据:使用NaN(Not a Number)来表示缺失数据。其值等于np.nan。内置的None值也会被当做NaN处理。
  • 处理缺失数据的相关方法:
    • dropna() 过滤掉值为NaN的行
    • fillna() 填充缺失数据
    • isnull() 返回布尔数组,缺失值对应为True
    • notnull() 返回布尔数组,缺失值对应为False
  • 过滤缺失数据:sr.dropna() 或 sr[data.notnull()]
  • 填充缺失数据:fillna(0)

DataFrame

DataFrame是一个表格型的数据结构,含有一组有序的列。

DataFrame可以被看做是由Series组成的字典,并且共用一个索引。

创建方式:

  • pd.DataFrame({'one':[1,2,3,4],'two':[4,3,2,1]})
  • pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']), 'two':pd.Series([1,2,3,4],index=['b','a','c','d'])})
In [195]: df = pd.DataFrame({
'one':pd.Series([1,2,3],index=['a','b','c']), 'two' ...: :pd.Series([1,2,3,4],index=['b','a','c','d'])})In [196]: dfOut[196]: one twoa 1.0 2b 2.0 1c 3.0 3d NaN 4

csv文件读取与写入:

  • df.read_csv('filename.csv')
  • df.to_csv()

常用属性及方法:

  • T 转置
  • index 获取索引
  • columns 获取列索引
  • values 获取值数组
    In [213]: dfOut[213]:    one  twoa  1.0    2b  2.0    1c  3.0    3d  NaN    4In [214]: df.indexOut[214]: Index(['a', 'b', 'c', 'd'], dtype='object')In [215]: df.columnsOut[215]: Index(['one', 'two'], dtype='object')In [216]: df.valuesOut[216]: array([[  1.,   2.],       [  2.,   1.],       [  3.,   3.],       [ nan,   4.]])

索引和切片:

In [196]: dfOut[196]:    one  twoa  1.0    2b  2.0    1c  3.0    3d  NaN    4In [197]: df['one'] #只能是列名Out[197]: a    1.0b    2.0c    3.0d    NaNName: one, dtype: float64
In [221]: dfOut[221]:    one  twoa  1.0    2b  2.0    1c  3.0    3d  NaN    4In [222]: df.loc['a',df.columns[1]] #行和列Out[222]: 2

通过位置获取:

  • df.iloc[3]
  • df.iloc[3,3]
  • df.iloc[0:3,4:6]
  • df.iloc[1:5,:]
  • df.iloc[[1,2,4],[0,3]]

通过布尔值过滤:

  • df[df['A']>0]
  • df[df['A'].isin([1,3,5])]
    In [237]: df['one'].isin([1.0,3.0])Out[237]: a     Trueb    Falsec     Trued    FalseName: one, dtype: bool
  • df[df<0] = 0

DataFrame数据对齐与缺失数据:

DataFrame处理缺失数据的方法:

  • dropna(axis=0, how='any',…) #默认删一行,axis = o 删行,axis = 1 删列
  • In [261]: dfOut[261]:    one  two    1a  1.0  2.0  NaNb  2.0  1.0  1.0c  3.0  3.0  NaNd  NaN  NaN  NaN3  1.0  1.0  1.0In [262]: df.dropna()Out[262]:    one  two    1b  2.0  1.0  1.03  1.0  1.0  1.0In [263]: df.dropna(axis=1)Out[263]: Empty DataFrameColumns: []Index: [a, b, c, d, 3]
  • fillna()
  • isnull()
  • notnull()
In [223]: dfOut[223]:    one  twoa  1.0    2b  2.0    1c  3.0    3d  NaN    4In [224]: df.fillna(11)Out[224]:     one  twoa   1.0    2b   2.0    1c   3.0    3d  11.0    4

pandas常用方法(适用Series和DataFrame):

  • mean(axis=0,skipna=False)
  • sum(axis=1)
  • sort_index(axis, …, ascending) 按行或列索引排序
  • sort_values(by, axis, ascending) 按值排序
  • NumPy的通用函数同样适用于pandas 
  • apply(func, axis=0) 将自定义函数应用在各行或者各列上 ,func可返回标量或者Series
  • applymap(func) 将函数应用在DataFrame各个元素上
  • map(func) 将函数应用在Series各个元素上

层次化索引

  • 层次化索引是Pandas的一项重要功能,它使我们能够在一个轴上拥有多个索引级别。
  • 例:data=pd.Series(np.random.rand(9), index=[['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c'], [1,2,3,1,2,3,1,2,3]])

从文件读取

  • 读取文件:从文件名、URL、文件对象中加载数据
    • read_csv 默认分隔符为csv
    • read_table 默认分隔符为\t
    • read_excel 读取excel文件
  • 读取文件函数主要参数:
    • sep 指定分隔符,可用正则表达式如'\s+'
    • header=None 指定文件无列名
    • name 指定列名
    • index_col 指定某列作为索引
    • skip_row 指定跳过某些行
    • na_values 指定某些字符串表示缺失值
    • parse_dates 指定某些列是否被解析为日期,布尔值或列表
  • 写入到文件:
    • to_csv
  • 写入文件函数的主要参数:
    • sep
    • na_rep 指定缺失值转换的字符串,默认为空字符串
    • header=False 不输出列名一行
    • index=False 不输出行索引一列
  • 其他文件类型:json, XML, HTML, 数据库
  • pandas转换为二进制文件格式(pickle):
    • save
    • load

时间对象处理(常作为索引):

  • 第三方包:dateutil
    • dateutil.parser.parse()
  • 成组处理日期:pandas
    • pd.to_datetime(['2001-01-01', '2002-02-02'])
  • 产生时间对象数组:date_range
    • start 开始时间
    • end 结束时间
    • periods 时间长度
    • freq 时间频率,默认为'D',可选H(our),W(eek),B(usiness),S(emi-)M(onth),(min)T(es), S(econd), A(year),…

时间序列就是以时间对象为索引的Series或DataFrame。

  • datetime对象作为索引时是存储在DatetimeIndex对象中的。
  • 时间序列特殊功能:
    • 传入“年”或“年月”作为切片方式
    • 传入日期范围作为切片方式
df = pd.read_csv('601318.csv',index_col='date',parse_dates=['date'],)

In [266]: df

Out[266]: 

            Unnamed: 0    open   close    high     low      volume    code

date                                                                      

2007-03-01           0  22.074  20.657  22.503  20.220  1977633.51  601318

2007-03-02           1  20.750  20.489  20.944  20.256   425048.32  601318

2007-03-05           2  20.300  19.593  20.384  19.218   419196.74  601318

2007-03-06           3  19.426  19.977  20.308  19.315   297727.88  601318

2007-03-07           4  19.995  20.520  20.706  19.827   287463.78  601318

2007-03-08           5  20.353  20.273  20.454  20.167   130983.83  601318

2007-03-09           6  20.264  20.101  20.353  19.735   160887.79  601318

2007-03-12           7  19.999  19.739  19.999  19.646   145353.06  601318

2007-03-13           8  19.783  19.818  19.982  19.699   102319.68  601318

2007-03-14           9  19.558  19.841  19.911  19.333   173306.56  601318

2007-03-15          10  20.097  19.849  20.525  19.779   152521.90  601318

2007-03-16          11  19.863  19.960  20.286  19.602   227547.24  601318

2007-03-20          12  20.662  20.211  20.715  20.088   222026.87  601318

2007-03-21          13  20.220  19.911  20.308  19.823   136728.32  601318

2007-03-22          14  20.066  20.026  20.273  19.969   167509.84  601318

2007-03-23          15  20.017  19.938  20.101  19.739   139810.14  601318

2007-03-26          16  19.955  20.282  20.397  19.946   223266.79  601318

2007-03-27          17  20.216  20.269  20.467  20.145   139338.19  601318

2007-03-28          18  20.264  20.565  20.706  20.123   258263.69  601318

df[df['close']>df['open']] #时间索引的好处

转载于:https://www.cnblogs.com/mona524/p/7755395.html

你可能感兴趣的文章
LinearLayout
查看>>
学习python:day1
查看>>
css3动画属性
查看>>
第九次团队作业-测试报告与用户使用手册
查看>>
Equal Sides Of An Array
查看>>
CentOS笔记-用户和用户组管理
查看>>
Mongodb 基本命令
查看>>
Qt中QTableView中加入Check列实现
查看>>
“富豪相亲大会”究竟迷失了什么?
查看>>
控制文件的备份与恢复
查看>>
返回代码hdu 2054 A==B?
查看>>
Flink独立集群1
查看>>
iOS 8 地图
查看>>
20165235 第八周课下补做
查看>>
[leetcode] 1. Two Sum
查看>>
iOS 日常工作之常用宏定义大全
查看>>
PHP的SQL注入技术实现以及预防措施
查看>>
MVC Razor
查看>>
软件目录结构规范
查看>>
Windbg调试Sql Server 进程
查看>>