《利用Python进行数据分析》——Chapter5:Pandas

Pandas数据结构

  1. Series

类似于一维数组的对象,或看成一个定长的有序字典由一组数据及其数据标签组成
自动为数据创建一个0~N-1的整数型索引

obj = Series([4,7,5,3])
	0    4
	1    7
	2    5
	3    3
	dtype: int64
>>> obj.values     # 获取值(数组array(Numpy)表现形式)
>>> obj.index     # 获取索引
obj2 = Series([4,7,5,3], index=['a','b','c','d'])
	a    4
	b    7
	c    5
	d    3
	dtype: int64
# 通过索引的方式选取Series中的单个或一组值
>>> obj2['a']
>>> obj2[['a','b','c']]
# 使用字典直接创建Series
sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
obj3 = Series(sdata)
obj4 = Series(sdata, index = states)  # sdata中与states索引相匹配的值会被找出来并放到相应位置
# 检测是否缺失数据
pd.isnull(obj)
pd.notnull(obj)
# 数据对其功能:自动对齐不同索引的数据
>>> obj3 + obj4         
# obj3和obj4的索引的顺序不一致,可以直接加,对其不同索引的数据
# 索引和数据都有name属性
>>> obj4.name = 'population'
>>> obj4.index.name = 'states'
  1. DataFrame

是一个表格型的数据结构,DataFrame既有行索引也有列索引
自动加索引

# 传入由等长列表或Numpy数组组成的字典
>>> frame = DataFrame(data)
# 指定列序列,决定列的顺序;指定行标签
>>> DataFrame(data, columns = ['year', 'state', 'pop'], index = ['one', 'two', 'three', 'four', 'five'])
# 将DataFrame的列获取为一个Series:类似字典的标记方式/属性的方式
>>> frame2['state']    /   frame2.state      # 返回的Series拥有相同的索引,且其name属性也已被设置好了
# 将DataFrame的行获取为一个Series:.ix->已被更改为.loc(lable based)/.iloc(index based)
>>> frame2.ix['three']  /  frame2.iloc[3]  /  frame2.loc['three']
# 列可以通过赋值的方式修改
>>> frame2['debt'] = np.arange(5)
>>> frame2['debt'] = 某一个Series     # 自动对齐index
# del 用于删除列
>>> del frame['debt']
# 设置index和columns的name属性
>>> frame3.index.name = 'xxx'
>>> frame3.columns.name = 'xxx'
# 嵌套的字典:外层作为列,内层作为索引
# 可以输入给DataFrame构造器的数据
1. 二维ndarray			#数据矩阵,还可以传入行标或列标
2. 由数组、列表、元组组成的字典 	#每个序列会变成DataFrame的一列,所有序列的长度必须相同
3. Numpy的结构化/记录数组		#由数组组成的字典
4. 由Series组成的字典		#每个Series会组成一列,默认各Series的索引会被合并成结果的行索引
5. 由字典组成的字典		#外层作为列,内层作为索引,索引会合并
6. 字典或Series的列表		#各项将成为DataFrame的一行,字典的键和Series的索引会成为DataFrame的列标
7. 由列表或元素组成的列表		#类似于二维ndarray
8. 另一个DataFrame		# 该DataFrame的索引将被沿用
9. Numpy的MaskedArray		#类似于二维ndarray
  1. 索引对象

Pandas 的索引对象负责管理轴(行)标签和其他元数据

frame3.index
frame3.index[1:]
frame3.index[1] = 'xxx'		#错误,index不可修改
# pandas中主要的index对象
index		#最泛化的index对象,
Int64Index
MultiIndex
DatetimeIndex
PeriodIndex
index的方法和属性
append		# 连接另一个Index对象,产生一个新的Index
diff		#计算差集,并得到一个index
intersection		#计算交集
union		#计算并集
isin		#索引是否在所给函数的参数内
delete		#删除索引i处的元素,并得到新的index
drop		#删除传入的值,
insert		#将元素插入到索引i处
is_monotonic	#当各元素均大于等于前一个元素时,返回True
is_unique	#当Index没有重复值时,返回True
unique		#计算index中唯一值的数组

基本功能

  1. 重新索引:reindex

将原有的索引的顺序,按新的指定的顺序“重新索引”
需要一些插值处理:method选项

ffill/pad		#前向填充(或搬运)值
bfill/backfill		#后向填充(或搬运)值
frame2.reindex(index=['a', 'b', 'c','d'], columns=['one', 'two', 'three'])
# 会向frame2查找相同索引名、相同列名的数据,找不到为NaN,不是简单的覆盖原名称
#插值只能按行应用(轴0)
# reindex函数的参数
index		# 用作索引的新序列
method		#插值填充的方式
fill_value	#在重新索引的过程中,需要引入缺失值时使用的替代值
limit		#前向或后向填充时的最大填充量
level		#在MultiIndex的指定级别上匹配简单索引
copy		#默认为True,无论如何都复制,False:新旧不相等时复制
  1. 丢弃指定轴上的项

drop方法返回的时一个在指定轴上删除了指定值的新对象

Series:
>>> new_obj = obj.drop('c')/obj.drop(['c','d'])
DataFrame:
>>> frame.drop('a')/([x,x,x])
>>> frame.drop('Ohio', axis = 1)
  1. 索引、选取和过滤

Series的索引值不只是整数,可以是索引名,可以是一个列表
切片:Series末端是闭区间
DataFrame的索引值不能是整数,可以是索引名(列名,或.loc[行名]),可以是一个列表
切片:DataFrame的切片时从行上进行的,末端是开区间

DataFrame的索引选项

**根据.iloc和.loc修改**
obj[val]		#选取某列
obj.ix[val],obj.loc['x'],obj.iloc[val]	
			#选取某行
obj.ix[:, val]		#选取单个列或子集
obj.ix[val1, val2]	#同时选取行和列
reindex方法		#将一个或多个轴匹配到新索引
xs方法			#根据标签选取单行或单列,并返回一个Series
icol,irow方法		#根据整数位置选取单行或单列,并返回一个Series
at(frame.at[4, 'B']),iat方法		
			#根据行标签和列表前选取单个值
###
loc中,所有的参数都是‘xxx'
iloc中,所有的参数都是数字
切片就切片,不用在切片的外面再套[x:x]:data.iloc[0:2,[0,1]]
  1. 算术运算和数据对齐

对不同索引的对象进行算术运算,对DataFrame言,对齐操作会同时发生在行和列上
如果存在不同的索引对时,结果的索引就是该索引的并集,在不重叠的索引处引入了NA值,缺失值会在算术运算中传播

  • 在算术方法中填充值

在对齐过程中找不到值时填充一个特殊值(比如0)

灵活的算术方法
add()
sub()
div()
mul()
>>> df1.add(df2, fill_value=0)
  • DataFrame与Series之间的运算
  1. 默认情况下,DataFrame和Series之间的算术运算会将Series的索引匹配到DataFrame的列,然后沿着行一直向下广播
  2. 如果希望匹配行且在列上广播,必须使用算术运算方法:frame.sub(series3,axis=0),传入的轴号时希望匹配的轴
  1. 函数应用和映射
#将函数应用到每一个函数:
	Numpy的元素级数组方法	np.abs(frame)
	applymap方法		frame.applymap(f)
#将函数应用到行或列的一维数组:
	DataFrame的apply方法	frame.apply(fun, axis=x)(#把axis想成返回的结果的索引的轴)
  1. 排序和排名
sort_index()	#按索引对Series排列
sort_index(axis=x, ascending = True/False)方法	
		#按索引对DataFrame某行或某列进行排序(按字典顺序)
order()方法	#按值对Series排序,缺失值会被放到Series的末尾
sort_values(by='x')	#DataFrame中按某列的顺序进行排列
排名:在原有的数据的位置上给出排名
obj.rank(ascending = , method = 'x')
# 破坏平级关系的method选项
average	#默认,在相等分组中,为各个值分配平均排名
min	#使用整个分组的最小排名
max	#使用整个分组的最大排名
first	#按值在原始数据中的出现顺序分配排名
  1. 带有重复值的轴索引

汇总和计算描述统计

# 约简方法的常用选项
axis	#约简的轴:行为0,列为1;默认为0
skipna	#排除缺失值,默认为True
level	#如果轴是层次化索引的,则根据level分组约简
# 描述和汇总统计
count		#非NA值的数量
describe	#针对Series或各DataFrame列计算汇总统计
min\max
argmin\argmax	#最大、最小值的索引的位置
idxmin\idxmax	#最大、最小值的索引的值
quantile	#计算样本的分位数
sum\mean
median
mad		#根据平均值计算绝对离差
var\std
skew\kurt	#偏度(三阶矩)、峰度(四阶矩)
cumsum\cumprod
cummin\cummax
diff		#一阶差分
pct_change	#计算百分数变化
  1. 相关系数和协方差
Series.corr(Series)	#Series的corr、cov方法用于计算两个Series中重叠的、非NA的、按索引对齐的值的相关性:
DataFrame.corr		#DataFrame的corr、cov方法将以DataFrame的形式返回完整的相关性:
DataFrame.corrwith(Series/DataFrame):(axis是一个参数)
  1. 唯一值、值计数以及成员资格
Series.unique()		#返回唯一值的数组(array)
Series.value_counts() 	#计算一个Series中各值出现的频率**索引是唯一值,值为频率**
Series.isin(['x','x'])	#“Series各值是否包含于传入的参数中”的布尔型数组

处理缺失数据

pandas利用Numpy的NaNcy表示缺失数据

# NA处理方法
dropna	#滤除缺失数据,课通过阈值调节对缺失值的容忍度
fillna	#用指定值或指定方法填充缺失数据
isnull	#判断是否是NA值的布尔对象,类型与原类型一致
notnull	#isnull的否定式
  1. 滤除缺失数据
Series:
dropna()	#返回一个仅含非空数据和索引值的Series
data[data.notnull()]
DataFrame:	希望丢弃全NA的行或列,含有NA的行或列
dropna():	默认丢弃任何含有NA的行
	dropna(how='all', axis=1):	丢弃全为NA的列
	dropna(thresh=x):	每行NA值个数大于thresh才删除
  1. 填充缺失数据
df.fillna(0)
df.fillna({1:0.5, 3:-1})	#通过一个字典调用fillna,可以实现对不同的列填充不同的值
df.fillna(inplace=True) 	#对现有对象就地修改
# 对index有效的插值方法也可用于fillna
# fillna函数的参数
value		#填充缺失值的标量值或字典对象
method		#插值方式,默认ffill
axis		#轴
inplace		#直接修改调用者
limit		#可以连续填充的最大数量

层次化索引

在一个轴上拥有多个索引级别:以低维度形式处理高纬度数据
层次化索引在数据重塑和基于分组的操作(如透视表生成)中扮演重要的角色。

  1. 重拍分级顺序
frame.swaplevel('xxx','xxx')	#交换名称的索引层级(xxx是索引的names)
frame.sortlevel(1)		#
  1. 根据级别汇总统计

指定索引级别,进行汇总统计操作
利用了pandas的groupby功能

frame.sum(level='xxx',axis=x)	#在指定的索引名称的级别上汇总统计
  1. 使用DataFrame的列

将DataFrame的一个或多个列当作行索引来用,或者将行索引变成DataFrame的列

frame.set_index('xxx',drop = False)	#默认这些列会从DataFrame中移除,但也可以将其保留下来
frame.reset_index()	#层次化索引的级别会被转移到列里面

其他有关pandas的话题

你可能感兴趣的:(python,McKinney,python,pandas)