(一)pandas基础
常用的两种数据结构:Series,DataFrame.
鉴于Series可根据index取得values,可通过字典来创建Series。
isnull和notnull用于检测确实数据。
布尔型索引,层次化索引(重新分级排序),重新索引(reindex(),参数:index, method, fill_value, limit, level, copy)
drop(),丢弃指定轴上的项,即丢弃行或列,有个axis参数制定行(axis=0)还是列(axis=1).
利用ix对指定的行,列标签进行索引,如data.ix(行标签,列标签),非常好用的索引方法。
sort-index(),接受一个axis参数,对行或列标签进行排序,若要对列的值进行排序,可使用by参数。
data.describe() 用于一次产生多个汇总统计。
value_counts() 返回一个Series,其索引为唯一值,按发现的顺序返回。
unique计算Series中的唯一值数组,按发现的顺序返回。
缺失数据处理方法:
dropna() 根据各标签的值中是否存在缺失数据对轴标签进行过滤,可通过调节阀值调整对缺失值的容忍度。
fillna() 填充缺失数据,参数:value,method,axis,inplace,limit。
(二)pandas数据读取
pd.read_csv() 加载带分隔符的数据,默认分隔符为逗号
pd.read_table() 也是加载带分隔符的数据,默认分隔符为制表符("\t")
read_fwf() 读取定宽列格式数据(也即无分隔符)
数据保存。
json.loads() 将Json字符串转换为python格式
json.dumps() 将python对象转换为Json格式
Pytables和h5py 高速读写,适用于大量数据,密集IO型
pd.read_csv()/pd.read_table()的参数:
path 文件路径及文件名
sep或delimiter 分隔符,支持正则
header 用作列名的行号,默认第一行,无则设置为None
index_col 用作行索引的列名或列编号
names header=None时自行设置的列名
skiprows 忽略行数,从头算起
skip_footer 忽略行数,从文件尾算起
nrows 读取的行数
iterator 返回一个TextParser以便逐块读取
chunksize 文件块的大小(用于迭代)
(三)数据规整化:清理,转换,合并,重塑
pd.merge()参数:
left,right 参与合并的左右的DataFrame
how inner,outer,left,right之一,默认为inner,即取交集,outer取并集
on 用于连接的列名。默认以两个DataFrame的交集作为连接键
left_on,right_on 左右DataFrame中用作连接键的列
left_index,right_index 将左/右侧行索引作为连接键
sort 根据连接键对合并后的数据进行排序,默认为True。处理大数据时禁用以获得更好的性能
suffixes 字符串元组,用于追加到重叠列名的末尾,默认为('_x','_y').
copy 设置为False可以在某些特殊情况下避免将数据复制到结果数据结构中,默认为True
join方法能更为方便地实现按索引合并。
轴向连接,pd.concat(),参数:
objs 参与连接的pandas对象的列表或字典,唯一必需的参数,如[df1,df2]
axis 连接的轴向,默认为o(行)
join inner,outer之一,指明合并方式:交集还是并集
join_axes 指明用于其他n-1条轴的索引,不执行交/并集运算
keys 与连接对象有关的值,用于形成连接轴向上的层次化索引
levels 指定用作层次化索引个级别上的索引,若设置了keys的话
names 设置分层索引的名称,前提时设置了keys或者values
verify_integrity 检查结果对象新轴上的重复情况,若有则异常,默认False允许重复
ignore_index 不保留连接轴上的索引,产生一组新的索引
利用合并来实现根据另一个dataframe来对一个dataframe进行筛选:
In [27]: df1 = pd.DataFrame({'a':list(range(3)),'b':list(range(1,4)),'c':['aa','bb','cc']})
In [42]: df2 = pd.DataFrame({'a':list(range(1,4)),'b':list(range(2,5))})
In [36]: # df2.columns = list(df1.columns)[:len(df2.columns)] # 这是为了使合并时相同内容的列列名相同
In [45]: pd.concat([df1,df2,df2]).drop_duplicates(subset=('a','b'),keep=False)
Out[45]: # 删除了a,b列中df1与df2值相同的行
a b c
0 0 1 aa
combine_first(),为含有重叠索引的机组数据互相打补丁,也即互补填充NaN值。
重塑层次化索引.
stack 将数据的列'旋转'为行
unstack 将数据的行'旋转'为列
pivot()可达到类似的效果。
移除重复数据
duplicated() 返回一个布尔型Series判断每一行是否重复
drop_duplicates( ) 移除重复行,也可移除指定重复列,可考虑先排序再消去重复
map()可用来添加或转换某列或与某列有对应关系的列
replace()直接对DataFrame中的特定值进行替换
rename()转换轴标签,不改变原数据,若inplace=True,则改变原数据
cut()划分样本所属区间,将其分为几类
qcut()将样本划分为几个区间,每个区间内样本数相等
get_dummies() 可用于机器学习的数据处理,将各个特征分类变成0,1
(四)matplotlib API入门
(1)创建Figure,fig=plt.figure()
。plt.gcf()可得到当前Figure的引用。
(2)在Figure中绘图时先加入一个活多个subplot才行。ax1=fig.add_subplot(2,2,1)
(3)在ax1中绘图,plt.plot(np.random.randn(50).cumsum(), 'k--')
(4)设置坐标轴范围,ax1=set_xlim(a,b), ax1.set_ylim(m,n)
(5)设置坐标轴刻度,ax1.set_xticks(....), ax1.set_yticks(....)
。也可设置其他值(如字符串)作为刻度,如
ax1.set_xtickslables(*strings)
(6)设置x,y轴名称,ax1.set_xlable('x'); ax1.set_ylable('y')
(7)设置图片标题,ax1.set_title('hello world')
(8)设置图例,一般在绘图时加入,如plt.plot(np.random.randn(50.cumsum()), 'k--', lable='apple')
,后面的lable参数即为图例。最后调用ax1.legend(loc="best")或plt.legend(loc="best")
来显示图例。
(9)添加注释(如文本、箭头等)。添加文本ax1.text(x,y,'hello',fontsize=10)
,(x,y)为添加文本的位置,"hello"为添加文本的内容。
(10)保存。plt.savefig("figpath.png")
,参数:
fname 含文件路径的字符串或python的文件型对象,图片格式有文件扩展名推断出,如png,pdf等
dpi 图片分辨率,默认为100
facecolor,edgecolor 图像背景色,默认白色
farmat 直接设置图片格式,如JPG,pdf等
bbox_inches 图像需保存的部分,若设置为"tight",则尽可能剪除图像周围空白部分。
(五)pandas中的绘图函数回执的matplotlib
Series.plot()方法,也可在DataFrame中使用,参数:
label 用于图例的标签
ax 要在其上进行绘制的matplotlib subplot对象,若未设置,则使用当前matplotlib subplot
style 传给matplotlib的画图风格字符串,如"ko--"
alpha 图像的填充不透明度(0-1)
kind 图的类型,可以是"line","bar","barh"(水平柱状图),"kde"(密度图)
logy 在y轴上使用对数标尺
use_index 将对象的索引用作刻度标签
rot 旋转刻度标签
xticks,yticks 用作x/y刻度的值
xlim, ylim x/y轴的界限
grid 显示轴网格线,默认打开
专用于DataFrame的plot参数:
subplots 将各个DataFrame列绘制到单独的subplot中
sharex,sharey 若subplots为True,则共用一个x/y轴
figsize 表示图像大小的元组
title 图像标题
legend 添加一个subplot图例,默认为True
sort_columns 以字母表顺序绘制各列,默认使用当前列顺序
(1)柱状图 kind='bar'或kind='barh'(水平柱状图)。设置stacked=True可生成堆叠状柱状图(各行堆在一起)。
归一化。
(2)直方图与密度图
(3)散点图
(六)数据聚合与分组运算
GroupBy技术 split-apply-combine 拆分-应用-合并
一般用法:df.groupby('key1')['data1'] <==> df['data1'].groupby(df['key1'])
有时候根据层次化索引分组是个不错的选择,传入level参数,如df.groupby(level='city', axis=1).count()
groupby()可根据行列标签以及函数来进行分组。
经过优化的groupby方法:
count 分组中非NA值的数量
sum 非NA值的和
mean ...平均值
median ...中位数
std,var 无偏(分母为n-1)标准差和方差
min,max ...最大值和最小值
prod 非NA值的积
first,last 第一个,最后一个非NA值
#栗子
import numpy as np
import pandas as pd
df1 = pd.DataFrame(np.arange(12).reshape((3,4)), columns=['chr','pos','a','b']
df = pd.concat([df1,df1])
#df
chr pos a b
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
df.groupby(['chr','pos']).sum()
a b
chr pos
0 1 2 3
4 5 6 7
8 9 10 11
groupby对象也可通过agg()方法对特定列使用自定义统计方法。
transform(向量化运算),将一个函数应用到各个分组,然后将结果放置到适当的位置上。
跟agg一样,transform也是一个有着严格条件的特殊函数:传入的函数只能产生两种结果,要么产生一个可以广播的标量值(如np.mean),要么产生一个相同大小的结果数组。
apply,最一般的groupby方法。apply会将待处理的对象拆分成多个片段,然后对各个片段调用传入的函数,最后尝试将各个片段组合到一起。例子:
import pandas as pd
df = pd.DataFrame({'key1': ['a', 'a', 'b', 'b', 'a'], 'key2': ['one', 'two', 'one', 'two', 'one'],
'data1': np.random.randn(5), 'data2': np.random.randn(5)})
def f(df, col=1):
return df[df['data2'] == max(df['data2'])]
df1 = df.groupby(['key1']).apply(f) #使用key1作为分组元素进行分组并使用data2筛选数据,留下每个组中data2最大的
print(df)
print(df1)
#输出
data1 data2 key1 key2
0 -0.407953 -0.506048 a one
1 -1.282764 0.575502 a two
2 0.697294 1.183693 b one
3 -1.699044 0.090585 b two
4 1.144997 0.224858 a one
data1 data2 key1 key2
key1
a 1 -1.282764 0.575502 a two
b 2 0.697294 1.183693 b one
[Finished in 2.7s]
透视表,pivot_table方法,参数:
values 待聚合的列的名称,默认聚合所有数值列
rows 用于分组的列名或其他分组键,出现在结果透视表的行
cols 用于分组的列名或其他分组键,出现在结果透视表的列
aggfunc 聚合函数或函数列表,默认为mean,可以是任何对groupby对象有效的函数
fill_value 用于替换结果表中的缺失值
margins 添加行/列小计的总计,默认为False
交叉表,crosstab。