Python数据分析~Pandas库30分钟快速入门

目录

1  Pandas序列和数据表

2 Pandas数据聚合与分组运算

3 Pandas数据可视化


    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大数据分析小站

​​​​​​​

欢迎大家在评论区提出意见和建议!

猜你喜欢

转载自blog.csdn.net/daitulin/article/details/120055855