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, :])