NumPy和Pandas


NumPy和Pandas都是用Python做数据处理时非常好用的库。在一个新同学要使用Python做数据分析处理时,通常都会被推荐使用NumPy和Pandas这2个库。

Numpy提供了很多方便统计计算的功能,比如计算均值(mean函数)和标准差(std函数)。NumPy支持向量计算,例如向量加法、与标量相乘等。而Pandas则更进一步,它是基于NumPy开发的数学分析工具,是为了解决数据分析任务而开发的,用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效、方便很多。

一维数组

既然要做数据分析,那就不能只是分析单个数据了,所以从一维数组的数据分析开始。在NumPy中,一维数组的格式是Array,Pandas中则是Series。因此,在开始操作一维数组之前,需要搞清楚List、Array和Series的区别。

List VS Array

  • List是Python内置的数据结构,Array是NumPy中定义的数据结构;
  • List中的元素可以是不同类型,而Array中的元素则必须是同一类型;

Array VS Series

  • Array是NumPy中定义的数据结构,Series是Pandas中定义的数据结构;
  • Series有索引,可以用index来定义这个索引,方便索引后面的元素,这一点上Array是没有的;

NumPy中操作一维数组

在NumPy中操作一维数组很方便,例如:

# 导入NumPy包,并重命名成np
import numpy as np

# 定义一组数据
n = np.array(range(2, 7))

# 查询
print(n[0])

# 切片
print(n[1:])

# 查看数据类型
print(n.dtype)

相对于列表,NumPy提供了统计分析功能,比如用mean() 计算均值,用std() 计算标准差,例如:

# 计算均值
print(n.mean())

# 计算标准差
print(n.std())

Pandas中的一维数组

上文提到,Pandas中的一维数组使用的是Series,同时在创建Series实例时,可以指定索引index,格式为:

x = pd.Series([], index=[])

定义好一维数组之后,就可以使用describe()方法来查看一维数组的描述统计信息,包括一维数组里面有多少个元素、平均值是多少、标准差以及四分位信息。使用Pandas创建一维数组的示例如下:

import pandas as pd

data = [37.74, 180.9, 163.14, 1150.3, 160.86, 1028.49]
index = ["Tencent", "Alibaba", "Apple", "Google", "Facebook", "Amazon"]

# 定义股票数组
stocks = pd.Series(data, index=index)

# 查看一维数组的统计信息
print(stocks.describe())

在Pandas中,查看Series信息有iloc和loc 2种方法,这2个方法的区别是:

  • iloc可以用 "index=[]"根据元素的位置来获取元素的值;
  • loc根据索引的值来获取元素的值; 操作如下:

    # 使用iloc查询 print(stocks.iloc[0])

    # 使用loc查询 print(stocks.loc["Facebook"])

跟NumPy一维数组Array一样,Pandas的Series也支持向量运算,但只能与索引值相同的值相加,否则会被用NaN填充。

# 创建Stocks2
stocks2 = pd.Series(data, index=index)
print(stocks + stocks2)

# 创建只有3个元素的Series
stocks3 = pd.Series([1, 2, 3])
print(stocks + stocks3)

如果想在数据分析过程中不出现空值NaN,有2个办法:

  • 使用dropna()方法来删除空值NaN;
  • 可用add将2个一维数组相加,并传入fill_value参数,其中fill_value用来填充空值,例如用0代替NaN;

二维数组

相对于一维数组,二维数组更加常见,因为二维数组既有行也有列,类似于Excel里的二维表格。在NumPy中是通过Array来创建一个二维数组的,其数组中的所有元素都是同样的数据类型,比如都是数字。虽然容易计算,但是不利于像Excel这样的场景。Pandas则是通过DataFrame来创建一个二维数组的,有利于表达像Excel中的数据。

NumPy中的二维数组

在NumPy中实现二维数组的方式很简单,例如:

import numpy as np

data_metrix = [
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12]
]

# 创建二维数组
n = np.array(data_metrix)

要想访问二维数组中的元素,可以有几种做法:

使用下标访问元素

Array的下标访问和List的访问类似,例如:

print(n[0][2])

也可以通过Array的特殊下标用法:

print(n[0, 2])

如果想查看数组中指定的行,可以使用":"或者直接下标进行访问,例如:

print(n[0])
print(n[0,:])

这2行是等价的。

使用 ":" 来代替数组中的列

如果想访问数组中指定的列,可以使用":"来表示,例如:

print(n[:, 1])

这行代码表示将数组n的第二列打印出来。

Pandas中的二维数组

相对于NumPy中的二维数组Array,Pandas的二维数组有专门的数据结构: DataFrame,它有如下优点:

  • 数组中每一列都可以是不同类型,方便表示Excel中的数据(所以经常用来处理Excel中的数据)
  • 数组中的每一行/列都有一个索引表格,类似于一维数组的Series,使得常见的表格数据很容易制作;

    import pandas as pd from collections import OrderedDict

# 定义参数字典
sales_dict = {
    "购买时间": ["2020-04-10", "2020-04-11", "2020-04-12", "2020-04-13", "2020-04-14"],
    "手机号": ["13700000000", "13700000001", "13700000002", "13700000003", "13700000004"],
    "商品名称": ["Good1", "Good2", "Good3", "Good4", "Good5"],
    "销售数量": [1, 3, 5, 7, 9],
    "金额": [110, 135, 157, 158, 209],
}

# 导入数据,将它做成有序字典
sales_order_dict = OrderedDict(sales_dict)

# 生成二维数组
df = pd.DataFrame(sales_order_dict)

# 输出二维数组
print(df)

在DataFrame中也可以使用iloc和loc查询数组中的元素,例如:

# 查看二维数组的均值
print(df.mean())

# 使用iloc根据位置获取数据的值
print(df.iloc[0, 3])

# 分别查询某一行和某一列
print(df.iloc[0, :])
print(df.iloc[:, 0])

# 根据index获取具体的值
print(df.loc[0, "手机号"])

在Pandas中还可以通过过滤条件来筛选数据,例如:

# 构建查询条件
query_series = df.loc[:, "销售数量"] > 3

# 输出过滤后的结果
print(df.loc[query_series, :])