pandas数据分析进阶笔记(三):pandas

(一)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)散点图

(六)数据聚合与分组运算

image.png

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。

推荐阅读更多精彩内容