Python数据分析利器——pandas简单教学
前一篇文章,我提到了python中用于矩阵处理的numpy库,今天我带来的是python数据分析中另一个很核心的库——pandas,它是python中分析结构化数据的工具集,最初设计出来用来处理金融数据,如今它用于处理各种各样的数据集。
(预防针:pandas的结构与操作比numpy多一些,因此我只介绍操作方法,具体的参数在使用时一查即可 ^_^)
注意:不知道为什么,下面代码开头可能有这样一段代码:<span style="font-size:14px;">。请大家忽略掉这段代码,直接看他后面的。我并不知道CSDN的代码为什么会包含这个。。。给大家带来的不便,十分抱歉。
pandas也不是python自带的库,像安装其他的第三方库一样,依然使用pip可以快速,方便,无污染的完成。
sudo pip install pandas如果是windows系统或没有安装pip的同学可以先去自行查找一下,pip这个利器是python学习中很必要的(我觉得很必要啦!!),它使安装第三方库变得十分方便。
导入:按照惯例,使用前要将库导入:
import pandas as pd
我们习惯性的将pandas重命名为pd,这样我们在使用时直接用pd就可以了(依然不要问我为什么这样做,我也不知道。。)
1、Series、日期序列与DataFrame
pandas中Series序列就像是一维数组,创建方法如下:
s = pd.Series({1,3,5}):创建一个序列,索引采用默认索引(即0,1,2,3......)s.value_counts:统计各元素出现的次数;s.unique():获得元素列表。s.isin():看s中的元素是否在参数列表中,返回一个布尔矩阵。
日期序列专门用来存放日期,创建与常用运算方法如下:
①date = pd.data_range("20171112", periods=6, freq=):创建日期序列,从20171112开始的6天;freq为采集的频率,常用的有‘s’, "Q", "min"等(Q代表季度)。
②date = pd.period_range("2016Q1", "2017Q1", freq="Q"):创建以季度为单位的时间戳。③date.to_timestamp():将时间戳转化为日期格式。④pd.Timestamp("20171112") - pd.pd.Timestamp("20170101"):直接相减运算天数。⑤pd.Timestamp("20171112") + pd.Timedelta(days=5):在已有日期上加5天。
DataFrame就像是二维数组,创建与常用运算方法如下:
data = pd.DataFrame(np.random.randn(6,4), index=date, columns=["A", "B", "C", "D"])字典创建:d = {"A": 1, "B": pd.Timestamp("20171112"), "C": np.arange(4)}data = pd.DataFrame(d):此时行标签为默认标签,列标签为字典的key值。DataFrame属性:
①data.head():默认查看前5行数据,括号内可以直接填写其他数字改变默认查看值。②data.tail():默认查看后5行数据,括号内同样可以直接填写其他数字改变默认查看值。③data.columns:查看列标签。④data.index:查看行标签。⑤data.describe():查看整体统计学数据(只会计算数字列)⑥data.T:转置。⑦data.mean():每列的平均值;axis=1求每行的平均值;注:NaN不会参与计算。⑧data.sub(s):二维DataFrame减一维Series,DataFrame中每列均会减该Series序列
2、索引
①行索引与列索引
data.index(columns).name = XX:为索引起名字。
②索引类
pandas内有许多索引类,可以用pd.*Index?查看
③重复索引
当索引重复时,查找返回的是一个Series,不重复则返回数据。
s.index.is_unique:查看索引是否重复。
④多级索引
1)Series中index=pd.MutiIndex.from_tuples(tuple, name=["1", "2"]) 创建多级索引;DF中用列表嵌套创建多级索引。 2)索引交换
df1 = df.swaplevel("row-1", "row-2"):这里的row-1是索引名。 df2.sortlevel(0):按一级索引排序;1则代表按二级索引排序。3)多级索引下的统计
求和:df.sum(level=0),按照一级索引求和。
住:多级索引下统计,用level控制索引级数。
4)列与索引的转换
df.set_index("c"):将c列设置为索引值。
df.set_index(["c", "d"]):将c列设为一级索引,d列设为二级索引。
df.reset_index():将索引转化为列数据;但顺序可能变化,再加.sort_index("colunm")即可。
3、基础运算
1)重新索引
①Series中,利用s.reindex(["A", "B", "C", "D"], fill_value=0, method="ffill"):重新索引,填充为0,若使用method的ffill参数则会将前面的索引值赋给后面;bfill是指向后填充。②DataFrame中,同样是reindex()方法,有index、columns分别控制行索引和列索引;但method参数对列没效果。
2)丢弃一部分数据
DataFrame中,丢弃一行:data.drop("index");丢弃一列:data.drop("columns", axis=1)。
3)映射函数
1)apply():把二维数组按行或列做运算,默认参数为函数,默认对列操作,axis=1时为行操作。2)applymap():把二维数组中每个元素做相应计算。3)map():把每行做运算。
4)排序与排名
排序操作:
data.sort_index(axis=1,ascending=False):对列标签降序排列;axis=0排序行标签。data.sort_values(by="A"):对A标签的值排序,默认为升序。
排名操作:
Series中,用s.rank()方法获取排名。DataFrame中与Series相似,用df.rank(method=‘first’)获取,参数method设为first指先出现的排名高。5)空数据(NaN)处理
①data.dropna(axis, how):抛弃NaN所在行的数据,axis=1时抛弃NaN所在列的数据;how中可以是参数any和all,分别代表只有一个NaN就抛弃和一行(列)全为NaN时才抛弃。
②data.fillna(value=5):用5去填充NaN。
③pd.isnull(data):返回布尔矩阵,为NaN的显示True;用.any()合并显示,可用两次合并直接显示结果。
4、访问
data["A"]或data.A:选择data数据中A标签下面的值。data[2: 4]:显示2、3对应的行。高效通过标签访问方法:
①data.loc["20171101": "20171112"]:括号内只支持标签。②data.iloc[2: 4]:通过切片高效访问,括号内两个数分别代表行、列。③data.at[: 3, ["A", "C"]]:将上述两种方法结合起来访问的方法。④data.at[pd.Timestamp("20171112"), "B"]:只支持pandas原生数据结构的访问。⑤data.iat[1, 1]:高效访问特定元素的方法。data[data > 10]:获得DataFrame(DF)中所有大于10的数据,这个访问与numpy中的一样。
5、修改元素
定位相应元素后直接用‘=’修改,可以改某个元素,也可以是某行或某列。data["A"][0] = 0将A、0标签下元素值修改为0.data[data.A > 4] = 0:将data中A列值大于4的所有行的值修改为0。data["F"]=np.NaN:直接添加新的NaN一列。data["F"]=s:多加一列非空数据时,要保证新的Series的index与data的index相同。6、时间日期
①创建
可以用Series产生数据,用python默认库的datetime格式作为索引。
可以用pd.date_range()方法创建;其中可以控制开始,结束,period、freq(BW、4H等选项)等参数。
可以用pd.period_range()方法创建,此方法上面已经提及。
②转化
p = pd.Period(2016) --> p.asfreq("M", how="start"):转化为2016年1月;若无how,则转化为2016年12月。
p = pd.Period("2016-04", freq="M") --> p.asfreq("A-DEC"); p.asfreq("A-MAR"):此转化在公司财年中常用。
住:关于freq中具体间隔,可以在网上查到具体表格,有很多复杂表示方法。
③重采样
1)时间戳序列与日期序列转换:to_period()与to_timestamp()
2)data.resample("5min", how="ohlc"):OHLC重采样,时间间隔为5分钟;以开盘,最高,最低,收盘数据为目标。
3)groupby重采样:data.groupby(lambda x: x.month); data.groupby(data.to_period("M")):转化为每月的信息。
4)升采样和插值:低频率-->高频率称为升采样。data.resample("D", fill_method="ffill", limit=3):取前值赋给3个数。
5)时期重采样:data.resample("A-DEC", how="mean"), 以每年12月对平均值重采样;此方法也在财年问题中常用。
7、数据整形与数据透视
1)数据整形
s = data.stack():将优先级低的列索引变为行索引,若已有行索引,则变为二级(三级)行索引。
s.unstack():将优先级的最低的行索引转化为列索引,若已有列索引,则变为二级(三级)列索引。
2)数据透视
即构建想要的行、列索引来显示所需要的某些数据。
res = data.pivot_table(values=["D"], index=["A", "B"], columns=["C"], aggfunc="xx")
①values:所需要列中的数据。
②index:透视后行索引名称。
③columns:透视后列索引名称。
④aggfunc:聚合方法。
8、数据导入导出
pandas中支持的数据格式只要有:csv、HDFS、Excel、hdf、sql、json、html、stata、pickle等。
1)导入(以csv文件为例):
pd.read_csv("xx.csv", header=, names=["a", "msg"], index_col=["msg"], sep=, na_values=, chunksize=, parse_dates=)
①打开xx.csv文件,一般会将语句赋值给一个变量。②header为None表示数据文件的第一行不作为列索引,若header=3则表示在读取文件时跳过文件前3行。③names:不愿使用数据第一行作为索引又不愿使用默认索引时,由names指定每列的索引名称。④index_col:指定行索引名称,上述例子中使用列名中的msg作为行索引。⑤sep:在该参数中写正则表达式可以处理不规则的数据间的分隔符。⑥na_values:控制缺失值,如:na_values={"message": ["NULL", "NA"]},将message列中NULL与NA设为缺失值。⑦chunksize:与for循环连用可以实现逐块处理数据,chunksize指定每次读多少行。⑧parse_dates:为True表示在读取文件时解析时间日期。
2)导出(以csv文件为例):
data.to_csv("xx.csv", index=False, header=None, columns=["b", "c"], sep=",")
①将data变量中存放的数据写入到xx.csv文件中。②index:为False表示不存行标签。③header:为None表示不存列标签。④columns:表示只存储 "b", "c" 两列的数据。⑤sep:表示数据见用 "," 作为分隔符。
9、数据合并(聚合)
1)concat
data_eg = pd.concat([data.iloc[:3], data.iloc[3:]]):合并示例。res = pd.concat([df1, df2], axis, ignore_index=True):axis=0为竖合并,1位横合并,ignore_index忽略本身行标签。res = pd.concat([df1, df2], join):join默认‘outer’,即合并不同标签下数据时填充为NaN,‘inner’会裁剪掉该数据。
2)merge
res = pd.merge(ONE, TWO, on=["标签"], how=, indicator=, suffixes=)
①通过标签合并ONE与TWO数组。②on:按照on后面标签合并,其中标签可以有多个。③how:how中有4中参数,分别为left,right,inner,outer,分别代表双标签时不同的合并方法。④indicator:为True时具体显示merge后的每个数据原本属于哪个数组。⑤suffixes:当合并前有相同标签时,为合并后数组的列去新名字来区分合并后来自不同数组的数据。
10、分组计算
①data.groupby(["A", "B"]).sum():先按A标签分组,再按B标签分为亚组,再对应求和。
②for name, group in data.groupby("key"):groupby()操作支持迭代器,因此可以用for循环迭代。
③data.groupby(data.dtypes, axis=a).sum():按照列的种类对列分组。
④mapping={"a": "red", "b": "red", "c": "blue"}, res=data.groupby(mapping, axis=1).sum():通过字典分组。其中red列是由以前的a列与b列相加所得。
⑤data.groupby(len).sum():按照行标签程度进行分组,传的函数不用加括号。
⑥data.groupby(level="country", axis=1).sum():按标签名为country的列求和分组。
注:任何形式的分组后都要加对应的聚合函数,否则只会返回分组的物理地址,而不会有数据
常用聚合函数有:
.sum()、.mean()、.min()、.max()、.describe()、.count()、.std()、first()
agg()方法可以调用自己定义的聚合函数;还有高级聚合方法transform();有兴趣或者需要用到时再查一下用法即可。
11、数据可视化(均要借助matplotlib.pyplot中的.show()方法实现)
1)线形图
一维数组:s.plot(title="test", style="r--", figsize=(8, 6), x=, y=):标题,线样式、图尺寸、x和y坐标轴数值。二位数组:df.plot(subplots=True, sharey=True):将每个列标签画一张图,两张图y轴的范围一样。上述plot方法中参数互相均是可以通用的,只是没有重复列出来。
2)柱状图
data.ix[0].plot(kind="bar"):将data中行标签为0的行用柱状图可视化。data.plot.bar(stacked=True):画出堆叠柱状图。data.plot.barh():画横向柱状图。
3)直方图
data.plot.hist(bins=, alpha= ):直方图方法,参数与前面类似。其中bins为分多少块;alpha控制透明度。
4)概率密度图
data.plot.kde()
5)散布图
data.plot.scatter(x="a", y="b", color=, label=, ax=)
①画出a列与b列之间散布图,方便查看两列间的数据关系。②设置颜色、标签。③ax可以等于其他画图变量,实现将多散布图一起画在一幅图中。
6)饼状图
s.plot.pie(figsize(6,6), label=["AA", "BB", "CC"], autopct="%0.2f", frontsize=20, color=)
①设置图的大小,若两数不相等图则会成为椭圆形。②指定每部分的标签名称。③电视每部分所占百分比大小。④字体大小于颜色控制。
本篇对pandas介绍的就是这些了,因为只是梗概型介绍,所有有很多参数不能完全介绍出来,因此如果用到的时候,大家一定要先去查一下官方文档。有可能你认为很难完成的一个操作,也许只是pandas方法中更改一个参数的问题!!
后面我会写一篇利用pandas去处理电影数据的博文,如果有兴趣的同学可以去看一下pandas是如何具体应用在数据分析上的。
好啦,这篇文章就到这里啦。拜了个拜! ^_^
- 上一篇:没有了
- 下一篇:没有了