利用Python进行数据分析笔记:3.1数据结构

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用Python进行数据分析笔记:3.1数据结构相关的知识,希望对你有一定的参考价值。

参考技术A

元组是一种固定长度、不可变的Python对象序列。创建元组最简单的办法是用逗号分隔序列值:

tuple 函数将任意序列或迭代器转换为元组:

中括号 [] 可以获取元组的元素, Python中序列索引从0开始

元组一旦创建,各个位置上的对象是无法被修改的,如果元组的一个对象是可变的,例如列表,你可以在它内部进行修改:

可以使用 + 号连接元组来生成更长的元组:

元组乘以整数,则会和列表一样,生成含有多份拷贝的元组:

将元组型的表达式赋值给变量,Python会对等号右边的值进行拆包:

拆包的一个常用场景就是遍历元组或列表组成的序列:

*rest 用于在函数调用时获取任意长度的位置参数列表:

count 用于计量某个数值在元组中出现的次数:

列表的长度可变,内容可以修改。可以使用 [] 或者 list 类型函数来定义列表:

append 方法将元素添加到列表尾部:

insert 方法可以将元素插入到指定列表位置:
插入位置范围在0到列表长度之间

pop 是 insert 的反操作,将特定位置的元素移除并返回:

remove 方法会定位第一个符合要求的值并移除它:

in 关键字可以检查一个值是否在列表中;
not in 表示不在:

+ 号可以连接两个列表:

extend 方法可以向该列表添加多个元素:

使用 extend 将元素添加到已经存在的列表是更好的方式,比 + 快。

sort 方法可以对列表进行排序:

key 可以传递一个用于生成排序值的函数,例如通过字符串的长度进行排序:

bisect.bisect 找到元素应当被插入的位置,返回位置信息
bisect.insort 将元素插入到已排序列表的相应位置保持序列排序

bisect 模块的函数并不会检查列表是否已经排序,因此对未排序列表使用bisect不会报错,但是可能导致不正确结果

切片符号可以对大多数序列类型选取子集,基本形式是 [start:stop]
起始位置start索引包含,结束位置stop索引不包含

切片还可以将序列赋值给变量:

start和stop可以省略,默认传入起始位置或结束位置,负索引可以从序列尾部进行索引:

步进值 step 可以在第二个冒号后面使用, 意思是每隔多少个数取一个值:

对列表或元组进行翻转时,一种很聪明的用法时向步进值传值-1:

dict(字典)可能是Python内建数据结构中最重要的,它更为常用的名字是 哈希表 或者 关联数组
字典是键值对集合,其中键和值都是Python对象。
是创建字典的一种方式,字典中用逗号将键值对分隔:

你可以访问、插入或设置字典中的元素,:

in 检查字典是否含有一个键:

del 或 pop 方法删除值, pop 方法会在删除的同时返回被删的值,并删除键:

update 方法将两个字典合并:
update方法改变了字典元素位置,对于字典中已经存在的键,如果传给update方法的数据也含有相同的键,则它的值将会被覆盖。

字典的值可以是任何Python对象,但键必须是不可变的对象,比如标量类型(整数、浮点数、字符串)或元组(且元组内对象也必须是不可变对象)。
通过 hash 函数可以检查一个对象是否可以哈希化(即是否可以用作字典的键):

集合是一种无序且元素唯一的容器。

set 函数或者是用字面值集与大括号,创建集合:

union 方法或 | 二元操作符获得两个集合的联合即两个集合中不同元素的并集:

intersection 方法或 & 操作符获得交集即两个集合中同时包含的元素:

常用的集合方法列表:

和字典类似,集合的元素必须是不可变的。如果想要包含列表型的元素,必须先转换为元组:

《利用python进行数据分析》读书笔记--第五章 pandas入门

http://www.cnblogs.com/batteryhp/p/5006274.html

 

pandas是本书后续内容的首选库。pandas可以满足以下需求:

  • 具备按轴自动或显式数据对齐功能的数据结构。这可以防止许多由于数据未对齐以及来自不同数据源(索引方式不同)的数据而导致的常见错误。.
  • 集成时间序列功能
  • 既能处理时间序列数据也能处理非时间序列数据的数据结构
  • 数学运算和简约(比如对某个轴求和)可以根据不同的元数据(轴编号)执行
  • 灵活处理缺失数据
  • 合并及其他出现在常见数据库(例如基于SQL的)中的关系型运算

1、pandas数据结构介绍

两个数据结构:Series和DataFrame。Series是一种类似于以为NumPy数组的对象,它由一组数据(各种NumPy数据类型)和与之相关的一组数据标签(即索引)组成的。可以用index和values分别规定索引和值。如果不规定索引,会自动创建 0 到 N-1 索引。

技术分享
#-*- encoding:utf-8 -*-
import numpy as np
import pandas as pd
from pandas import Series,DataFrame

#Series可以设置index,有点像字典,用index索引
obj = Series([1,2,3],index=[‘a‘,‘b‘,‘c‘])
#print obj[‘a‘]
#也就是说,可以用字典直接创建Series

dic = dict(key = [‘a‘,‘b‘,‘c‘],value = [1,2,3])
dic = Series(dic)
#下面注意可以利用一个字符串更新键值
key1 = [‘a‘,‘b‘,‘c‘,‘d‘]
#注意下面的语句可以将 Series 对象中的值提取出来,不过要知道的字典是不能这么做提取的
dic1 = Series(obj,index = key1)
#print dic
#print dic1
#isnull 和  notnull 是用来检测缺失数据
#print pd.isnull(dic1)
#Series很重要的功能就是按照键值自动对齐功能
dic2 = Series([10,20,30,40],index = [‘a‘,‘b‘,‘c‘,‘e‘])
#print dic1 + dic2
#name属性,可以起名字
dic1.name = ‘s1‘
dic1.index.name = ‘key1‘
#Series 的索引可以就地修改
dic1.index = [‘x‘,‘y‘,‘z‘,‘w‘]
技术分享

DataFrame是一种表格型结构,含有一组有序的列,每一列可以是不同的数据类型。既有行索引,又有列索引,可以被看做由Series组成的字典(使用共同的索引)。跟其他类似的数据结构(比如R中的data.frame),DataFrame面向行和列的操作基本是平衡的。其实,DataFrame中的数据是以一个或者多个二维块存放的(不是列表、字典或者其他)。

技术分享
#-*- encoding:utf-8 -*-
import numpy as np
import pandas as pd
from pandas import Series,DataFrame

#构建DataFrame可以直接传入等长的列表或Series组成的字典
#不等长会产生错误
data = {‘a‘:[1,2,3],
        ‘c‘:[4,5,6],
        ‘b‘:[7,8,9]
}
#注意是按照列的名字进行列排序
frame = DataFrame(data)
#print frame
#指定列之后就会按照指定的进行排序
frame = DataFrame(data,columns=[‘a‘,‘c‘,‘b‘])
print frame
#可以有空列,index是说行名
frame1 = DataFrame(data,columns = [‘a‘,‘b‘,‘c‘,‘d‘],index = [‘one‘,‘two‘,‘three‘])
print frame1
#用字典方式取列数据
print frame[‘a‘]
print frame.b
#列数据的修改直接选出来重新赋值即可
#行,可以用行名或者行数来进行选取
print frame1.ix[‘two‘]
#为列赋值,如果是Series,规定了index后可以精确赋值
frame1[‘d‘] = Series([100,200,300],index = [‘two‘,‘one‘,‘three‘])
print frame1
#删除列用del 函数
del frame1[‘d‘]
#警告:通过列名选出来的是Series的视图,并不是副本,可用Series copy方法得到副本
技术分享

另一种常见的结构是嵌套字典,即字典的字典,这样的结构会默认为外键为列,内列为行。

技术分享
#-*- encoding:utf-8 -*-
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
#内层字典的键值会被合并、排序以形成最终的索引
pop = {‘Nevada‘:{2001:2.4,2002:2.9},
       ‘Ohio‘:{2000:1.5,2001:1.7,2002:3.6}}
frame3 = DataFrame(pop)
#rint frame3
#Dataframe也有行和列有name属性,DataFrame有value属性
frame3.index.name = ‘year‘
frame3.columns.name = ‘state‘
print frame3
print frame3.values
技术分享

下面列出了DataFrame构造函数能够接受的各种数据。

技术分享

索引对象

技术分享
#-*- encoding:utf-8 -*-
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
#pandas索引对象负责管理轴标签和其他元数据,构建Series和DataFrame时,所用到的任何数组或其他序列的标签都被转换为Index
obj = Series(range(3),index = [‘a‘,‘b‘,‘c‘])
index = obj.index
#print index
#索引对象是无法修改的,这非常重要,因为这样才会使得Index对象在多个数据结构之间安全共享
index1 = pd.Index(np.arange(3))
obj2 = Series([1.5,-2.5,0],index = index1)
print obj2.index is index1

#除了长得像数组,Index的功能也类似一个固定大小的集合
print ‘Ohio‘ in frame3.columns
print 2003 in frame3.index
技术分享

pandas中的Index是一个类,pandas中主要的Index对象(什么时候用到)。

技术分享

下面是Index的方法与属性,值得注意的是:index并不是数组。

技术分享

2、基本功能

下面介绍基本的Series 和 DataFrame 数据处理手段。首先是索引:

技术分享
#-*- encoding:utf-8 -*-
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pandas import Series,DataFrame

#Series有一个reindex函数,可以将索引重排,以致元素顺序发生变化

obj = Series([1,2,3,4],index=[‘a‘,‘b‘,‘c‘,‘d‘])
#注意这里的reindex并不改变obj的值,得到的是一个“副本”
#fill_value 显然是填充空的index的值
#print obj.reindex([‘a‘,‘c‘,‘d‘,‘b‘,‘e‘],fill_value = 0)
#print obj
obj2 = Series([‘red‘,‘blue‘],index=[0,4])
#method = ffill,意味着前向值填充
obj3 = obj2.reindex(range(6),method=‘ffill‘)
#print obj3

#DataFrame 的reindex可以修改行、列或者两个都改
frame = DataFrame(np.arange(9).reshape((3,3)),index = [‘a‘,‘c‘,‘d‘],columns = [‘Ohio‘,‘Texas‘,‘California‘])
#只是传入一列数,是对行进行reindex,因为...frame的行参数叫index...(我这么猜的)
frame2 = frame.reindex([‘a‘,‘b‘,‘c‘,‘d‘])
#print frame2
#当传入原来没有的index是,当然返回的是空NaN
#frame3 = frame.reindex([‘e‘])
#print frame3
states = [‘Texas‘,‘Utah‘,‘California‘]
#这是对行、列重排
#注意:这里的method是对index 也就是行进行的填充,列是不能填充的(不管method的位置如何)
frame4 = frame.reindex(index = [‘a‘,‘b‘,‘c‘,‘d‘],columns=states,method = ‘ffill‘)
#print frame4

#使用ix的标签索引功能,重新索引变得比较简洁
print frame.ix[[‘a‘,‘d‘,‘c‘,‘b‘],states]
技术分享

关于ix,是DataFrame的一个方法,http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.ix.html

技术分享

技术分享

丢弃指定轴上的项

技术分享
#-*- encoding:utf-8 -*-
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pandas import Series,DataFrame
#drop函数可以丢弃轴上的列、行值
obj = Series(np.arange(3.),index = [‘a‘,‘b‘,‘c‘])
#原Series并不丢弃
obj.drop(‘b‘)
#print obj
#注意下面,行可以随意丢弃,列需要加axis = 1
print frame.drop([‘a‘])
print frame.drop([‘Ohio‘],axis = 1)
技术分享

下面说索引、选取和过滤

技术分享
#-*- encoding:utf-8 -*-
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pandas import Series,DataFrame

obj = Series([1,2,3,4],index=[‘a‘,‘b‘,‘c‘,‘d‘])
frame = DataFrame(np.arange(9).reshape((3,3)),index = [‘a‘,‘c‘,‘d‘],columns = [‘Ohio‘,‘Texas‘,‘California‘])

#Series切片和索引
#print obj[obj < 2]
#注意:利用标签的切片与python的切片不同,两端都是包含的(有道理)
print obj[‘b‘:‘c‘]
#对于DataFrame,列可以直接用名称
print frame[‘Ohio‘]
#特殊情况:通过切片和bool型索引,得到的是行(有道理)
print frame[:2]
print frame[frame[‘Ohio‘] != 0]
#下面的方式是对frame所有元素都适用,不是行或者列,下面的得到的是numpy.ndarray类型的数据
print frame[frame < 5],type(frame[frame < 5])
frame[frame < 5] = 0
print frame

#对于DataFrame上的标签索引,用ix进行
print frame.ix[[‘a‘,‘d‘],[‘Ohio‘,‘Texas‘]]
print frame.ix[2] #注意这里默认取行
#注意下面默认取行
print frame.ix[frame.Ohio > 0]
#注意下面的逗号后面是列标
print frame.ix[frame.Ohio > 0,:2]
技术分享

下面是常用的索引选项:

技术分享

技术分享

算术运算和数据对齐

技术分享
#pandas 有一个重要的功能就是能够根据索引自动对齐,其中索引不重合的部分值为NaN
s1 = Series([1,2,3],[‘a‘,‘b‘,‘c‘])
s2 = Series([4,5,6],[‘b‘,‘c‘,‘d‘])
#print s1 + s2
df1 = DataFrame(np.arange(12.).reshape(3,4),columns=list(‘abcd‘))
df2 = DataFrame(np.arange(20.).reshape(4,5),columns=list(‘abcde‘))
#print df1 + df2
#使用add方法,并传入填充值,注意下面的fill_value函数是先对应填充再进行加和,而不是加和得到NaN之后再填充
#print df1.add(df2,fill_value = 1000)
#df1.reindex(columns = df2.columns,fill_value=0)
技术分享

除了add之外,还有其他的方法:

技术分享

DataFrame和Series之间的运算

技术分享
#下面看一下DataFrame和Series之间的计算过程
arr = DataFrame(np.arange(12.).reshape((3,4)),columns = list(‘abcd‘))
#下面的结果标明,就是按行分别相减即可,叫做 broadcasting
#注意:默认情况下,DataFrame和Series的计算会将Series的索引匹配到DataFrame的列,然后进行计算,再沿着行一直向下广播
#注意:下面的式子中,如果写arr - arr[0]是错的,因为只有标签索引函数ix后面加数字才表示行
print arr - arr.ix[0]
Series2 = Series(range(3),index = list(‘cdf‘))
#按照规则,在不匹配的列会形成NaN值
print arr + Series2
#如果想匹配行且在列上广播,需要用到算术运算方法
Series3 = arr[‘d‘]
#axis就是希望匹配的轴
print arr.sub(Series3,axis = 0)
技术分享

下面是函数应用和映射

技术分享
#-*- encoding:utf-8 -*-
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pandas import Series,DataFrame

#NumPy的元素级数组方法也适用于pandas对象
frame = DataFrame(np.random.randn(4,3),columns = list(‘abc‘),index = [‘Ut‘,‘Oh‘,‘Te‘,‘Or‘])
print frame
#下面是求绝对值:
#print np.abs(frame)
#另一种常见的做法是:将一个函数应用到行或者列上,用apply方法,与R语言类似
fun = lambda x:x.max() - x.min()
#默认是应用在每一列上
print frame.apply(fun)
#下面是应用在列上
print frame.apply(fun,axis = 1)
#很多统计函数根本不用apply,直接调用方法就可以了
print frame.sum()
#除了标量值之外,apply函数后面还可以接返回多个值组成的的Series的函数,有没有很漂亮?
def f(x):
    return Series([x.min(),x.max()],index = [‘min‘,‘max‘])
#print frame.apply(f)
#元素级的python函数也是可以用的,但是要使用applymap函数
format = lambda x: ‘%.2f‘ % x
print frame.applymap(format)
#之所以要用applymap是因为Series有一个应用于元素级函数的map方法??
#这里的map很有用
print frame[‘b‘].map(format)
技术分享

排序与排名

技术分享
#-*- encoding:utf-8 -*-
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pandas import Series,DataFrame
#用sort_index函数对行、列的索引进行排序
obj = Series(range(4),index = [‘d‘,‘a‘,‘b‘,‘c‘])
print obj.sort_index()

frame = DataFrame(np.arange(8).reshape((2,4)),index = [‘three‘,‘one‘],columns = [‘d‘,‘a‘,‘b‘,‘c‘])
#默认是对行 “索引” 进行排序,如果对列 “索引” 进行排序,axis = 1 即可
print frame.sort_index()
print frame.sort_index(axis = 1)
print frame.sort_index(axis = 1,ascending = False)

#如果对值进行排序,用的是order函数,注意所有的缺失值会放到最后(如果有的话)
print obj.order()
#numpy中的sort也可以用来排序
print np.sort(obj)
#如果相对DataFrame的值进行排序,函数还是sort_index,只不过后面需要加一个参数by
frame = DataFrame({‘b‘:[4,7,-3,2],‘a‘:[0,1,0,1]})
print frame.sort_index(by = [‘a‘,‘b‘])

#rank函数返回从小到大排序的下标,对于平级的数,rank是通过“为各组分配一个平均排名”的方式破坏评级关系
#下标从1开始
obj = Series([7,-5,7,4,2,0,4])
print obj.rank()
#而numpy中的argsort函数比较奇怪,返回的是把数据进行排序之后,按照值得顺序对应的下标,下标从0开始
print np.argsort(obj)
 #打印结果为:1,5,4,3,6,0,2 按照这个下标顺序恰好可以得到从小打到的值,见下面
print obj[np.argsort(obj)]
#rank函数中有一个method选项,用来规定下标的方式

print obj.rank(method = ‘first‘,ascending=False)
print obj.rank(method = ‘max‘,ascending=False)
print obj.rank(method = ‘min‘,ascending=False)

#对于DataFrame,rank函数默认把每一列排好并返回坐标
print frame.rank()
print frame.rank(axis = 1)
技术分享

带有重复值的轴索引

技术分享
#-*- encoding:utf-8 -*-
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pandas import Series,DataFrame

#虽然pandas的很多函数(如reindex)要求标签唯一,但是并不具有强制性
obj = Series(range(5),index = list(‘aabbc‘))
print obj
#索引是否唯一用is_unique看是否唯一
print obj.index.is_unique
#对于重复值的索引,选取的话返回一个Series,唯一的索引返回一个标量
print obj[‘a‘]
#对于DataFrame也是如此
df = DataFrame(np.random.randn(4,3),index = list(‘aabb‘))
print df
print df.ix[‘b‘]
#####自己导入数据的时候数据处理之前可以做一下index唯一性等,自己创建DataFrame注意不能这样
技术分享

3、汇总和计算描述统计

技术分享
#-*- encoding:utf-8 -*-
import numpy as np
import os
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
import time

#pandas 对象拥有一组常用的数学和统计方法,大部分属于简约统计,用于从Series中提取一个值,或者   从DataFrame中提取一列或者一行Series
#注意:与NumPy数组相比,这些函数都是基于没有缺失数据的建设构建的,也就是说:这些函数会自动忽略缺失值。
df = DataFrame([[1.4,np.nan],[7.1,-4.5],[np.nan,np.nan],[0.75,-1.3]],index = list(‘abcd‘),columns=[‘one‘,‘two‘])
print df.sum()
print df.sum(axis = 1)
#下面是一些函数,idxmin 和 idmax 返回的是达到最小或者最大的索引
print df.idxmin()
print df.idxmin(axis=1)
#关于累积型的函数
print df.cumsum()
#describe函数,与R语言中的describe函数基本相同
print df.describe()
#对于非数值型的数据,看看下面的结果

obj = Series([‘c‘,‘a‘,‘a‘,‘b‘,‘d‘] * 4)
print obj.describe()
‘‘‘
结果为:
count     20
unique     4
top        a
freq       8
其中,freq是指字母出现的最高频率
‘‘‘
技术分享

技术分享

技术分享

技术分享

技术分享
#-*- encoding:utf-8 -*-
import numpy as np
import os
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
import time

#下面看一下cummin函数
#注意:这里的cummin函数是截止到目前为止的最小值,而不是加和以后的最小值
frame = DataFrame([[1,2,3,4],[5,6,7,8],[-10,11,12,-13]],index = list(‘abc‘),columns = [‘one‘,‘two‘,‘three‘,‘four‘])
print frame.cummin()
print frame
>>>
   one  two  three  four
a    1    2      3     4
b    1    2      3     4
c  -10    2      3   -13
   one  two  three  four
a    1    2      3     4
b    5    6      7     8
c  -10   11     12   -13
技术分享

相关系数与协方差

有些汇总统计(如相关系数和协方差)是通过参数对计算出来的。这一节数据得不到?上不去网。

唯一值、值计数以及成员资格

技术分享
#-*- encoding:utf-8 -*-
import numpy as np
import os
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt

obj = Series([‘a‘,‘a‘,‘b‘,‘f‘,‘e‘])
uniques = obj.unique()
uniques.sort() #记住这是就地排序
#print uniques
#下面进行计数统计,注意得到的是按照出现的频率降序排列
#print obj.value_counts()
#value_counts还是一个顶级的pandas方法。可用于任何是数组或者序列
#print obj.values
#print pd.value_counts(obj.values,sort = False)
#最后是isin 判断矢量化集合的成员资格,可用于选取Series中或DataF列中的子集
mask = obj.isin([‘b‘,‘c‘])
print mask
print obj[mask]

data = DataFrame({‘Qu1‘:[1,3,4,3,4],
                  ‘Qu2‘:[2,3,1,2,3],
                  ‘Qu3‘:[1,5,2,4,4]})
print data
print data.apply(pd.value_counts).fillna(0)
技术分享

技术分享

上面这几个函数是真的非常实用!

4、处理缺失数据

技术分享
#-*- encoding:utf-8 -*-
import numpy as np
import os
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
import time
from numpy import nan as NA

#pandas本来就被设计成自动忽略了缺失值、
#nan None 都看做缺失值
str_data = Series([‘a‘,np.nan,‘b‘,‘c‘])
str_data[0] = None
print str_data.isnull()
print str_data.notnull()
>>>
0     True
1     True
2    False
3    False
0    False
1    False
2     True
3     True
#NumPy的数据类型中缺少真正的NA数据类型或位模式??
 
技术分享

技术分享

滤除缺失数据

技术分享
#-*- encoding:utf-8 -*-
import numpy as np
import os
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
import time
from numpy import nan as NA

data = Series([1,NA,3.5,7,NA])
#注意返回的是不为NA的值的原来的索引,不是移除之后的索引
#有一个函数 reset_index 这个函数(方法?)可以重新设置index,其中drop = True选项会丢弃原来的索引而设置新的从0开始的索引,这个方法只对DataFrame有用貌似。
print data.dropna()
#下面的结果一样
print data[data.notnull()]
data1 = DataFrame([[1,2,3],[NA,2.3,4],[NA,NA,NA]])
#注意:由于DataFrame的设定,只要有NA的行就会舍弃
print data1.dropna()
#传入how = ‘all‘ 则丢掉全为NA的行,这里的 how 的起名真的有点随心所欲了,哈哈
print data1.dropna(how = ‘all‘)
#丢弃列
print data1.dropna(how = ‘all‘,axis = 1)
#还有一个参数,thresh
data2 = DataFrame(np.random.randn(7,3))
data2.ix[:4,1] = NA
data2.ix[:2,2] = NA
#print data2
#这里的thresh函数是选取最少non-NA值个数的行选出来
print data2.dropna(thresh = 2)
print data2.dropna(thresh = 4,axis = 1)
技术分享

填充缺失数据

技术分享
#-*- encoding:utf-8 -*-
import numpy as np
import os
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
import time
from numpy import nan as NA

#主要用fillna方法填充NA处的值
data2 = DataFrame(np.random.randn(7,3))
data2.ix[:4,1] = NA
data2.ix[:2,2] = NA
#fillna返回一个新对象,inplace = True 可以就地填充
print data2.fillna(0)
#print data2.fillna(0,inplace = True)
#print data2
#为不同的列填充要用到字典
print data2.fillna({1:0.5,3:-1})
#对reindex有效的的那些差值方法也可适用于fillna,请向上看,或者搜索 reindex 即可
df = DataFrame(np.random.randn(6,3))
df.ix[2:,1] = NA
df.ix[4:,2] = NA
print df.fillna(method = ‘ffill‘,limit = 2)
#只要稍微动动脑子,我们就可以知道向NA处可以填充均值等其他数
data = Series([1.2,NA,4,NA])
print data.fillna(data.mean())
技术分享

fillna的参数如下:

技术分享

技术分享

5、层次化索引

层次化索引(hierarchical index)是pandas的重要功能,这能使在一个轴上拥有两个以上的索引级别。抽象点说,它能使你以低维度形式处理高维度。

技术分享
#-*- encoding:utf-8 -*-
import numpy as np
import os
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
import time

data = Series(np.random.randn(10),index=[[‘a‘,‘a‘,‘a‘,‘b‘,‘b‘,‘b‘,‘c‘,‘c‘,‘d‘,‘d‘],[1,2,3,1,2,3,1,2,2,3]])
#print data
#下面是索引的选取方式

print data.index
print data[‘b‘]
print data[‘b‘:‘c‘]
print data.ix[[‘b‘,‘d‘]]
#下面是“内层”的选取方式
print data[:,2]
#层次化索引在数据重塑和基于分组操作(如透视表生成)中扮演者重要的角色,比如用unstack方式重排DataFrame:
print data.unstack()
#stack是unstack的逆运算
print data.unstack().stack()

#对于DataFrame,每个轴都可以有分层索引
frame = DataFrame(np.arange(12).reshape((4,3)),index = [[‘a‘,‘a‘,‘b‘,‘b‘],[1,2,1,2]],columns = [[‘Ohio‘,‘Ohio‘,‘Colorado‘],[‘Green‘,‘Red‘,‘Green‘]])
#print frame
#注意下面的方式:是为每一个轴规定名字,跟
frame.index.names = [‘key1‘,‘key2‘]
frame.columns.names = [‘state‘,‘color‘]
#print frame
#print frame[‘Ohio‘]

#可以单独创建MultiIndex然后复用
#下面的multiindex可以这样创建,注意下面的生成方式
columns = pd.MultiIndex.from_arrays([[‘Ohio‘,‘Ohio‘,‘Colorado‘],[‘Green‘,‘Red‘,‘Green‘]],names = [‘state‘,‘color‘])
frame1 = DataFrame(np.arange(12).reshape((4,3)),columns = columns)
print frame1
#重排顺序,调整索引级别
print frame.swaplevel(‘key1‘,‘key2‘)
#sortlevel则根据但各级别中的值对数据进行排序,通常用swaplevel是也会用到sortlevel(很合理)
#注意得到的是副本,不是就地修改
print frame.sortlevel(1)
print frame.swaplevel(0,1).sortlevel(0)
print frame

#许多对DataFrame和Series进行描述汇总的统计都有一个level选项,用于指定汇总方式
print frame.sum(level = ‘key2‘)
#不指定level的话,会按照列汇总出所有列名的和
print frame.sum()
print frame.sum(level = ‘color‘,axis = 1)
技术分享
技术分享
#-*- encoding:utf-8 -*-
import numpy as np
import os
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
import time
#人们经常想将DataFrame的一个或者多个列当作行索引来用,或者可能需要将行索引变成DataFrame的列
frame = DataFrame({‘a‘:range(7),‘b‘:range(7,0,-1),‘c‘:[‘one‘,‘one‘,‘one‘,‘two‘,‘two‘,‘two‘,‘two‘],‘d‘:[0,1,2,0,1,2,3]})
print frame
#DataFrame中的set_index函数会将其一个或者多个列转换为行索引
frame2 = frame.set_index([‘c‘,‘d‘])
print frame2  #其实就是利用第3、4列进行一次分类汇总
frame3 = frame.set_index([‘c‘,‘d‘],drop = False)
#与set_index相反的是reset_index函数
print frame2.reset_index()
#下面进行一次测试
frame4 = DataFrame([[0,7],[1,6],[2,5],[3,4],[4,3],[5,2],[6,1]],index = [[‘one‘,‘one‘,‘one‘,‘two‘,‘two‘,‘two‘,‘two‘],[0,1,2,0,1,2,3]],columns=[‘a‘,‘b‘])
frame4.index.names = [‘c‘,‘d‘]
print frame4
print frame4.reset_index().sort_index(axis = 1)
技术分享

其他有关pandas的话题

技术分享
#-*- encoding:utf-8 -*-
import numpy as np
import os
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
import pandas.io.data  as web
#这里说的是一些蛋疼的问题:整数索引和整数标签
ser = Series(np.arange(3.))
#print ser[-1]  #报错,因为整数索引的歧义性
ser2 = Series(np.arange(3.),index = [‘a‘,‘b‘,‘c‘])
print ser2[-1] #正确
#ix函数总是面向标签的
print ser.ix[:1]
#如果需要可靠的、不考虑索引类型的、基于位置的索引,可以使用Series的iget_value方法,Dataframe的irow 和 icol方法
ser3 = Series(range(3),index= [-5,1,3])
print ser3.iget_value(2)
frame = DataFrame(np.arange(6).reshape(3,2),index = [2,0,1])
print frame.irow(0)

#pandas 有一个Panel数据结构(不是主要内容),可以看作是三维的DataFrame。pandas中的多维数据可以利用多层索引进行处理
#可以利用DataFrame对象组成的字典或者一个三维ndarray来创建Panel对象
pdata = pd.Panel(dict((stk,web.get_data_yahoo(stk,‘1/1/2009‘,‘6/1/2012‘)) for stk in [‘AAPL‘,‘GOOG‘,‘MSFT‘,‘DELL‘]))
#网络错误,得不到数据
#Panel的每一项都是一个DataFrame.














以上是关于利用Python进行数据分析笔记:3.1数据结构的主要内容,如果未能解决你的问题,请参考以下文章

《利用python进行数据分析》读书笔记 --第二章 准备与例子

《利用Python 进行数据分析》 - 笔记

《利用python进行数据分析》学习笔记

《利用python进行数据分析》读书笔记--第五章 pandas入门

《利用python进行数据分析》之《第二章引言》学习笔记_2

《利用python进行数据分析》之《第二章引言》学习笔记_1