目录
Pandas库在数据分析中是非常重要和常用的库,它利用数据框让数据的处理和操作变的简单和快捷。在数据预处理、缺失值填补、时间序列、可视化等方面都有应用。接下来将会简单介绍Pandas的一些使用,主要包括:如何生成序列和数据表格、数据聚合与分组运算及数据可视化功能。Pandas库在导入后经常使用pd进行代替。本文的程序将会使用Jupyter Notebook的形式进行展示。
In[36]:import pandas as pd
1 Pandas序列和数据表
Pandas库中的序列(Series)是一维标签数组,能够容纳任何类型的数据。可以使用pd.Series( data, index,…)的方式生成序列,其中data指定序列中的数据,通常使用数组或者列表,index通常指定序列中的索引,例如:使用下面的程序可以生成序列s1,并且可以通过s1.values和s1.index获取序列的数值和索引。
In[37]:## 生成一个序列
s1 = pd.Series(data = [1,2,3,4,5],index = ["a","b","c","d","e"],
name = "var1")
s1
Out[37]:a 1
b 2
c 3
d 4
e 5
Name: var1, dtype: int64
In[38]:## 获取序列的数值和索引
print("数值:",s1.values)
print("索引:",s1.index)
Out[38]:数值: [1 2 3 4 5]
索引: Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
针对生成的序列可以通过切片和索引获取序列中的对应值,也可以对获得的数值进行重新的赋值操作。相关示例如下:
In[39]:## 通过索引获取序列中的内容
s1[["a","c"]]
Out[39]:a 1
c 3
Name: var1, dtype: int64
In[40]:## 通过索引改变数据的取值
s1[["a","c"]] = [10,12]
s1
Out[40]:a 10
b 2
c 12
d 4
e 5
Name: var1, dtype: int64
通过字典也可以生成序列,其中字典的键将会作为序列的索引,字典的值将会作为序列的值,下面的s2就是利用字典生成的序列。针对序列可以使用value_counts()方法,计算序列中每个取值出现的次数。
In[41]:## 通过字典生成序列
s2 = pd.Series({"A":100,"B":200,"C":300,"D":200})
s2
Out[41]:A 100
B 200
C 300
D 200
dtype: int64
In[42]:## 计算序列中每个取值出现的次数
s2.value_counts()
Out[42]:200 2
300 1
100 1
dtype: int64
数据表是Pandas提供的一种二维数据结构,数据按行和列的表格方式排列,是数据分析的经常使用的数据展示方式。数据表的生成通常使用pd.DataFrame( data, index, columns,…)的方式。其中data可以使用字典、数组等内容,index用于指定数据表的索引,columns用于指定数据表的列名。
使用字典生成数据表时,字典的键将会作为数据表格的列名,值将会作为对应列的内容。同时可以使用df1["列名"]的形式为数据表格df1添加新的列,或者获取对应列的内容。df1.columns属性则可以输出数据表格的列名。
In[43]:## 生成数据表,将字典生成数据表
data = {"name":["Anan","Adam","Tom","Jara","AqL"],
"age":[20,15,10,18,25],
"sex":["F","M","F","F","M"]}
df1 = pd.DataFrame(data = data)
print(df1)
Out[43]: name age sex
0 Anan 20 F
1 Adam 15 M
2 Tom 10 F
3 Jara 18 F
4 AqL 25 M
In[44]:## 为数据表添加新的变量
df1["high"] = [175,170,165,180,178]
print(df1)
Out[44]: name age sex high
0 Anan 20 F 175
1 Adam 15 M 170
2 Tom 10 F 165
3 Jara 18 F 180
4 AqL 25 M 178
In[45]:## 获取数据表的列名
df1.columns
Out[45]:Index(['name', 'age', 'sex', 'high'], dtype='object')
In[46]:## 通过列名获取数据表中的数据
print(df1[["age","high"]])
Out[46]: age high
0 20 175
1 15 170
2 10 165
3 18 180
4 25 178
针对数据表格df可以使用使用df.loc获取指定的数据,使用方式为df.loc[index_name , col_name],选择指定位置的数据。相关使用方法如下所示:
In[47]:## 输出某一行
print(df1.loc[2])
Out[47]:name Tom
age 10
sex F
high 165
Name: 2, dtype: object
In[48]:## 输出多行
print(df1.loc[1:3]) # 会包括第一行和第三行
Out[48]: name age sex high
1 Adam 15 M 170
2 Tom 10 F 165
3 Jara 18 F 180
In[49]:## 输出指定的行和列
print(df1.loc[1:3,["name","sex"]]) # 会包括第一行和第三行
Out[49]: name sex
1 Adam M
2 Tom F
3 Jara F
In[50]:## 输出性别为F的行和列
print(df1.loc[df1.sex == "F",["name","sex"]])
Out[50]: name sex
0 Anan F
2 Tom F
3 Jara F
数据表格的df.iloc方法,是基于位置的索引进行获取对应的内容,相关使用方式如下所示:
In[51]:## 获取指定的行
print("指定的行:\n",df1.iloc[0:2])
## 获取指定的列
print("指定的列:\n",df1.iloc[:,0:2])
Out[51]:指定的行:
name age sex high
0 Anan 20 F 175
1 Adam 15 M 170
指定的列:
name age
0 Anan 20
1 Adam 15
2 Tom 10
3 Jara 18
4 AqL 25
In[52]:## 获取指定位置的数据
print("指定位置的数据:\n",df1.iloc[0:2,1:4])
Out[52]:指定位置的数据:
age sex high
0 20 F 175
1 15 M 170
In[53]:## 根据条件索引获取数据是需要将索引转化为列表或数组
print(df1.iloc[list(df1.sex == "F"),0:3])
print(df1.iloc[np.array(df1.sex == "F"),0:3])
Out[53]: name age sex
0 Anan 20 F
2 Tom 10 F
3 Jara 18 F
name age sex
0 Anan 20 F
2 Tom 10 F
3 Jara 18 F
In[54]:list(df1.sex == "F")
Out[54]: [True, False, True, True, False]
In[55]:## 为数据表中的内容重新赋值
df1.high = [170,175,177,178,180]
print(df1)
Out[55]: name age sex high
0 Anan 20 F 170
1 Adam 15 M 175
2 Tom 10 F 177
3 Jara 18 F 178
4 AqL 25 M 180
In[56]:## 选择指定的区域并重新赋值
df1.iloc[0:1,0:2] = ["Apple",25]
print(df1)
Out[56]: name age sex high
0 Apple 25 F 170
1 Adam 15 M 175
2 Tom 10 F 177
3 Jara 18 F 178
4 AqL 25 M 180
2 Pandas数据聚合与分组运算
Pandas库提供了强大的数据聚合和分组运算能力,例如:可以通过apply方法,将指定的函数作用的数据的行或者列,而groupby方法更是可以对数据进行分组统计,这些功能对数据表的变换、分析和计算都非常有用。首先使用鸢尾花数据集介绍如何使用apply方法将函数应用于数据计算。
In[57]:## 读取用于演示的数据
Iris = pd.read_csv("data/chap1/Iris.csv")
print(Iris.head())
Out[57]: Id SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm Species
0 1 5.1 3.5 1.4 0.2 setosa
1 2 4.9 3.0 1.4 0.2 setosa
2 3 4.7 3.2 1.3 0.2 setosa
3 4 4.6 3.1 1.5 0.2 setosa
4 5 5.0 3.6 1.4 0.2 setosa
In[58]:## 使用apply方法将函数应用于数据
## 计算每列的均值
Iris.iloc[:,1:5].apply(func = np.mean,axis = 0)
Out[58]:SepalLengthCm 5.843333
SepalWidthCm 3.054000
PetalLengthCm 3.758667
PetalWidthCm 1.198667
dtype: float64
In[59]:## 计算每列的最小值和最大值
min_max = Iris.iloc[:,1:5].apply(func = (np.min,np.max),axis = 0)
print(min_max)
Out[59]: SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm
amin 4.3 2.0 1.0 0.1
amax 7.9 4.4 6.9 2.5
In[60]:## 计算每列的样本数量
Iris.iloc[:,1:5].apply(func = np.size,axis = 0)
Out[60]:SepalLengthCm 150
SepalWidthCm 150
PetalLengthCm 150
PetalWidthCm 150
dtype: int64
In[61]:## 根据行进行计算,只演示前5个样本
des = Iris.iloc[0:5,1:5].apply(func = (np.min, np.max, np.mean, np.std, np.var), axis = 1)
print(des)
Out[61]: amin amax mean std var
0 0.2 5.1 2.550 2.179449 4.750000
1 0.2 4.9 2.375 2.036950 4.149167
2 0.2 4.7 2.350 1.997498 3.990000
3 0.2 4.6 2.350 1.912241 3.656667
4 0.2 5.0 2.550 2.156386 4.650000
通过上面的程序可以发现利用apply方法可以使函数的应用变得简单,从而方便对数据进行更多的认识和分析。数据表的groupby方法则可进行分组统计,其应用上比apply方法更加的广泛,如:根据数据的不同类型,计算数据的一些统计性质,获得数据透视表。相关使用如下所示:
In[62]:## 利用groupby进行分组统计
## 分组计算均值
res = Iris.drop("Id",axis=1).groupby(by = "Species").mean()
print(res)
Out[62]: SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm
Species
setosa 5.006 3.418 1.464 0.244
versicolor 5.936 2.770 4.260 1.326
virginica 6.588 2.974 5.552 2.026
In[63]:## 分组计算偏度
res = Iris.drop("Id",axis=1).groupby(by = "Species").skew()
print(res)
Out[63]: SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm
Species
setosa 0.120087 0.107053 0.071846 1.197243
versicolor 0.105378 -0.362845 -0.606508 -0.031180
virginica 0.118015 0.365949 0.549445 -0.129477
数据表的聚合运算可以通过agg方法,并且该方法可以和groupby方法相结合进行使用,从而完成更复杂的数据描述和分析工作。如:可以计算不同数据特征的不同统计性质等。相关使用示例如下所示:
In[64]:## 数据聚合进行相关计算
res = Iris.drop("Id",axis=1).agg({"SepalLengthCm":["min","max","median"],
"SepalWidthCm":["min","std","mean",],
"Species":["unique","count"]})
print(res)
Out[64]: SepalLengthCm SepalWidthCm Species
count NaN NaN 150
max 7.9 NaN NaN
mean NaN 3.054000 NaN
median 5.8 NaN NaN
min 4.3 2.000000 NaN
std NaN 0.433594 NaN
unique NaN NaN [setosa, versicolor, virginica]
In[65]:## 分组后对数据的相关列进行聚合运算
res = Iris.drop("Id",axis=1).groupby(
by = "Species").agg({"SepalLengthCm":["min","max"],
"SepalWidthCm":["std"],
"PetalLengthCm":["skew"],
"PetalWidthCm":[np.size]})
print(res)
Out[65]: SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm
min max std skew size
Species
setosa 4.3 5.8 0.381024 0.071846 50.0
versicolor 4.9 7.0 0.313798 -0.606508 50.0
virginica 4.9 7.9 0.322497 0.549445 50.0
3 Pandas数据可视化
Pandas库提供了针对数据表和序列的简单的可视化方式,其可视化是基于Matplotlib库进行的。对Pandas的数据表进行数据可视化时,只需要使用数据表的plot()方法,该方法包含散点图、折线图、箱线图、条形图等数据可视化方式。下面使用数据演示一些Pandas库的数据可视化方法,获得数据可视化图像。
In[66]:## 输出高清图像
%config InlineBackend.figure_format = 'retina'
%matplotlib inline
## 可视化分组箱线图
Iris.iloc[:,1:6].boxplot(column=["SepalLengthCm", "SepalWidthCm"],
by = "Species",figsize = (12,6))
上面的程序是使用数据表的boxplot()方法获得箱线图,同时在可视化是,可视化两列数据"SepalLengthCm"和"SepalWidthCm"变量的箱线图,同时针对每个变量使用类别特征"Species"对其进行分组,最终可获得如图1所示的图像。
图1数据箱线图可视化
使用df.plot()方法对数据表进行可视化时,通常会使用kind参数指定数据可视化图像的类型,使用参数x指定横坐标轴使用的变量,使用参数y指定纵坐标轴使用的变量,还会使用其它的参数来调整数据的可视化结果。例如:针对散点图,可以使用参数s指定点的大小,使用参数c指定点的颜色等。利用数据表获得散点图的程序如下所示,运行程序后可获得如图2所示的图像。
In[67]:## 可视化散点图,设置颜色映射
col = Iris.Species.map({"setosa":"blue", "versicolor":"red",
"virginica":"green"})
Iris.plot(kind = "scatter",x = "SepalLengthCm",y = "SepalWidthCm",
s = 30, c = col,figsize = (10,6))
图2 数据散点图可视化
使用df.plot()方法时,指定参数kind = "hexbin"可以使用六边形热力图,对数据进行可视化,例如:针对鸢尾花数据中的"SepalLengthCm"变量和"SepalWidthCm"变量的六边形热力图,可使用下面的程序进行可视化,可获得如图3所示的图像。
In[68]:## 可视化六边形热力图
Iris.plot(kind = "hexbin",x = "SepalLengthCm",y = "SepalWidthCm",
gridsize = 15,figsize = (10,7),sharex = False)
图3 数据六边形热力图
可视化时指定参数kind = "line",可以使用折线图对数据进行可视化,例如:针对鸢尾花数据中的4个数值变量数据变化情况的折线图,可使用下面的程序进行可视化,运行程序后可获得如图4所示的图像。
In[69]:## 折线图
Iris.iloc[:,0:5].plot(kind = "line",x = "Id",figsize = (10,6))
图4 数据折线图可视化
Pandas的入门内容先介绍到这里,更多的内容可以参看官方文档进行探索和学习。
文章参考书籍CSDN介绍:《Python机器学习算法与实战》
更多学习内容请关注我的微信公众号:Adam大数据分析小站
欢迎大家在评论区提出意见和建议!