入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

Python数据分析利器——pandas简单教学

创建时间:2017-11-13 投稿人: 浏览次数:617

前一篇文章,我提到了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是如何具体应用在数据分析上的。

好啦,这篇文章就到这里啦。拜了个拜! ^_^














声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
  • 上一篇:没有了
  • 下一篇:没有了
未上传头像