Pandas
Pandas是一个基于Python编程语言的开源数据分析和数据处理库。它提供了一系列的数据结构,主要是DataFrame和Series,用于处理和分析表格数据(.csv、.xlsx等等)。
通常导入pandas
包简写为pd
,且pandas包经常和科学计算包numpy连用:
import pandas as pd
import numpy as np
.csv文件是非常常见的表格文件,它其实就是以’,’为分隔的文本文件。很多数据处理的任务中,要处理的数据对象就是.csv文件类型。
读取文件
pd.read_csv(filename: str, header: int |list | None, encoding, index_col: int | str | list)
一般来说,在读取数据时只需要简单调用df = pd.read_csv(filename)
即可将文件中的数据读入了。这里的d
类型是pandas内置的数据结构DataFrame
。
这里再介绍另外两个常见参数header、encoding
的用法。
- header:指定文件中哪几行作为列名。对于.csv文件而言,通常第一行就是列名(表头),此时header参数保留缺省值即可;而如果文件没有表头,只需设置
header=None
即可。
df = pd.read_csv('data.csv')
print(df)
'''
输出:
ID Name English Mathematics Physics
0 2020001 Bill 95 78 80
1 2020005 Ellis 90 92 81
2 2020008 Louis 94 85 89
注意:最左边的索引列并不是文件的原内容,因为在调用读取api时,并没有指定索引列,因此这里pandas库自动加入了自0开始逐一递增的索引列。从0开始的行才是真正的数据开始行。
'''
df = pd.read_csv('data.csv', header=None)
print(df)
'''
输出:
0 1 2 3 4
0 ID Name English Mathematics Physics
1 2020001 Bill 95 78 80
2 2020005 Ellis 90 92 81
3 2020008 Louis 94 85 89
'''
- encoding:指定文件按何种码进行读取。常见选项:utf-8、gbk等等。
- index_col:指定文件读取时的索引列。可以是列名(
str
),也可以是列序(int
)。如果是列表,则列表中的列共同组成索引。
data = pd.read_csv(csv_file, index_col='ID')
print(data)
'''
输出:
Name English Mathematics Physics
ID
2020001 Bill 95 78 80
2020005 Ellis 90 92 81
2020008 Louis 94 85 89
'''
data = pd.read_csv(csv_file, index_col=[0, 1])
print(data)
'''
输出:
English Mathematics Physics
ID Name
2020001 Bill 95 78 80
2020005 Ellis 90 92 81
2020008 Louis 94 85 89
'''
数据转换
DataFrame.values
通常和pd.read_csv(filename)
连用:pd.read_csv(filename).values
,用于将读入文件的DataFrame
对象转换为np.ndarray
类型,接下来就可以利用numpy包中的各种接口处理数据了,非常实用。
csv_file = './data.csv'
data = pd.read_csv(csv_file).values
print(data)
'''
输出:
[[2020001 'Bill' 95 78 80]
[2020005 'Ellis' 90 92 81]
[2020008 'Louis' 94 85 89]]
'''
查看数据
这一部分介绍一下常用的DataFrame
属性和方法。
csv_file = './data.csv'
df = pd.read_csv(csv_file, usecols=[2, 3, 4])
print(df)
df.head(2) # 返回最前2行的数据 head(n)
df.tail(2) # 返回最后2行的数据 tail(n)
df.shape # 返回数据表形状
df.dtypes # 返回每一列数据类型
df.count() # 返回每一列中的非空值的个数
df.mean() # 返回所有列的均值
df.corr() # 返回列与列之间的相关系数
df.max() # 返回每一列的最大值
df.min() # 返回每一列的最小值
df.median() # 返回每一列的中位数
df.std() # 返回每一列的标准差
df.var() # 返回每一列的方差
'''
输出:
English Mathematics Physics
0 95 78 80
1 90 92 81
2 94 85 89
'''
从这里开始,我们借助一个具体的实例,来展示各种API的使用方法和功能。我们读入一张新表,它简单记录了3台风力涡轮机的实时观测数据。
csv_file = 'turbines.csv'
df_raw = pd.read_csv(csv_file)
print(df_raw)
'''
ID Date Wspd Prtv Pab_max Patv
0 0 2022/1/1 0:00 6.17 0.25 1.00 494.66
1 0 2022/1/1 6:00 6.17 0.25 1.00 494.66
2 0 2022/1/1 12:00 6.27 0.24 1.00 509.76
3 0 2022/1/1 18:00 NaN 0.26 1.00 542.53
4 1 2022/1/1 0:00 6.25 0.23 0.99 509.36
5 1 2022/1/1 6:00 6.10 0.27 0.99 482.21
6 1 2022/1/1 12:00 6.77 0.23 0.99 584.75
7 1 2022/1/1 18:00 6.70 NaN 0.99 557.98
8 2 2022/1/1 0:00 6.44 0.21 1.00 503.94
9 2 2022/1/1 6:00 6.25 0.26 1.00 463.37
10 2 2022/1/1 12:00 6.87 0.25 1.00 577.47
11 2 2022/1/1 18:00 6.60 0.25 1.00 538.85
'''
取出表中指定部分
DataFrame.loc[inputs]
这个方法可以取出指定数据。
参数基本形式
参数形式 | 示例 |
---|---|
单标签 | 0 |
标签列表 | [‘a’, ‘b’, ‘c’] |
标签切片 | ‘a’:’d’, 0:5 |
布尔值列表(列表元素必须和轴方向元素数量一致) | [True, False, True, …, False] |
先来看一下这四种基本形式的参数下,对应的返回结果。
单标签
# 取指定行数据 df_sub = df_raw.loc[0] print(df_sub) ''' ID 0 Date 2022/1/1 0:00 Wspd 6.17 Prtv 0.25 Pab_max 1.0 Patv 494.66 Name: 0, dtype: object '''
标签列表
# 取指定行数据 df_sub = df_raw.loc[[0, 4, 9]] print(df_sub) ''' ID Date Wspd Prtv Pab_max Patv 0 0 2022/1/1 0:00 6.17 0.25 1.00 494.66 4 1 2022/1/1 0:00 6.25 0.23 0.99 509.36 9 2 2022/1/1 6:00 6.25 0.26 1.00 463.37 '''
标签切片
# 取指定行数据 df_sub = df_raw.loc[0:5] print(df_sub) ''' ID Date Wspd Prtv Pab_max Patv 0 0 2022/1/1 0:00 6.17 0.25 1.00 494.66 1 0 2022/1/1 6:00 6.17 0.25 1.00 494.66 2 0 2022/1/1 12:00 6.27 0.24 1.00 509.76 3 0 2022/1/1 18:00 NaN 0.26 1.00 542.53 4 1 2022/1/1 0:00 6.25 0.23 0.99 509.36 5 1 2022/1/1 6:00 6.10 0.27 0.99 482.21 '''
布尔值列表
# 取指定行数据 df_sub = df_raw.loc[[False, True, False, True, True, True, False, True, True, False, True, False]] # 由于共12行数据,故布尔值数组必须有12个布尔值 print(df_sub) ''' ID Date Wspd Prtv Pab_max Patv 1 0 2022/1/1 6:00 6.17 0.25 1.00 494.66 3 0 2022/1/1 18:00 NaN 0.26 1.00 542.53 4 1 2022/1/1 0:00 6.25 0.23 0.99 509.36 5 1 2022/1/1 6:00 6.10 0.27 0.99 482.21 7 1 2022/1/1 18:00 6.70 NaN 0.99 557.98 8 2 2022/1/1 0:00 6.44 0.21 1.00 503.94 10 2 2022/1/1 12:00 6.87 0.25 1.00 577.47 '''
填充缺失值
可以用如下方法快速对表中的缺失值进行填充。注意,这个方法过于简单,有时候可能无法满足实际需求。
DataFrame.fillna(value: Scalar | dict, method, axis: AxisType, inplace: boolean)
参数 | 简介 |
---|---|
value | 此项参数表示用固定值填充,指定用于填充的固定值。还支持平均值中位数值填充。 |
method | ‘ffill’ 用前一个非空缺值填充;‘bfill’ 用后一个非空缺值填充 |
axis | ‘index’:按行方向(参考同列数据)填充;’columns’按列方向(参考同行数据)填充 |
inplace | 是否用新生成的表替换原表,如果为’True’则原表被修改,’False’则返回一个新表 |
参数value的几种特别用法:
值 | 功能 |
---|---|
DataFrame.mean() | 用平均数填充 |
DataFrame.median() | 用中位数填充 |
DataFrame.max() | 用最大值填充 |
DataFrame.min() | 用最小值填充 |
我们先用零值填充全部的缺失值:
# 填充缺失值
df_zero = df_raw.fillna(value=0, inplace=False) # inplace为False,不修改原表,故返回新表
print(df_zero)
'''
ID Date Wspd Prtv Pab_max Patv
0 0 2022/1/1 0:00 6.17 0.25 1.00 494.66
1 0 2022/1/1 6:00 6.17 0.25 1.00 494.66
2 0 2022/1/1 12:00 6.27 0.24 1.00 509.76
3 0 2022/1/1 18:00 0.00 0.26 1.00 542.53
4 1 2022/1/1 0:00 6.25 0.23 0.99 509.36
5 1 2022/1/1 6:00 6.10 0.27 0.99 482.21
6 1 2022/1/1 12:00 6.77 0.23 0.99 584.75
7 1 2022/1/1 18:00 6.70 0.00 0.99 557.98
8 2 2022/1/1 0:00 6.44 0.21 1.00 503.94
9 2 2022/1/1 6:00 6.25 0.26 1.00 463.37
10 2 2022/1/1 12:00 6.87 0.25 1.00 577.47
11 2 2022/1/1 18:00 6.60 0.25 1.00 538.85
'''
然后尝试用前一个非缺失值,按行方向,参考同列进行填充:
df_ffill = df_raw.fillna(method='ffill', axis='index', inplace=True) # 这里修改原表,下面打印原表数据,发现确实已经改变
print(df_raw)
'''
ID Date Wspd Prtv Pab_max Patv
0 0 2022/1/1 0:00 6.17 0.25 1.00 494.66
1 0 2022/1/1 6:00 6.17 0.25 1.00 494.66
2 0 2022/1/1 12:00 6.27 0.24 1.00 509.76
3 0 2022/1/1 18:00 6.27 0.26 1.00 542.53
4 1 2022/1/1 0:00 6.25 0.23 0.99 509.36
5 1 2022/1/1 6:00 6.10 0.27 0.99 482.21
6 1 2022/1/1 12:00 6.77 0.23 0.99 584.75
7 1 2022/1/1 18:00 6.70 0.23 0.99 557.98
8 2 2022/1/1 0:00 6.44 0.21 1.00 503.94
9 2 2022/1/1 6:00 6.25 0.26 1.00 463.37
10 2 2022/1/1 12:00 6.87 0.25 1.00 577.47
11 2 2022/1/1 18:00 6.60 0.25 1.00 538.85
'''
同时,尝试用平均值填充缺失值:
# 仅使用‘Wspd’列数据平均值填充该列缺失值,并修改原表
df_raw.loc[:, 'Wspd'].fillna(value=df_raw.loc[:, 'Wspd'].mean(), axis='index', inplace=True)
print(df_raw)
'''
ID Date Wspd Prtv Pab_max Patv
0 0 2022/1/1 0:00 6.170000 0.25 1.00 494.66
1 0 2022/1/1 6:00 6.170000 0.25 1.00 494.66
2 0 2022/1/1 12:00 6.270000 0.24 1.00 509.76
3 0 2022/1/1 18:00 6.417273 0.26 1.00 542.53
4 1 2022/1/1 0:00 6.250000 0.23 0.99 509.36
5 1 2022/1/1 6:00 6.100000 0.27 0.99 482.21
6 1 2022/1/1 12:00 6.770000 0.23 0.99 584.75
7 1 2022/1/1 18:00 6.700000 NaN 0.99 557.98
8 2 2022/1/1 0:00 6.440000 0.21 1.00 503.94
9 2 2022/1/1 6:00 6.250000 0.26 1.00 463.37
10 2 2022/1/1 12:00 6.870000 0.25 1.00 577.47
11 2 2022/1/1 18:00 6.600000 0.25 1.00 538.85
'''
保存文件
DataFrame.to_csv(filename: str, decimal: str, index: boolean)
通常用上述方法将DataFrame
对象保存为文件;所以在此之前我们需要先创建一个DataFrame
对象:
pd.DataFrame(data: np.ndarray, columns: list)
X = np.random.randint(low=50, high=100, size=(5, 3)) # 创建一个随机整数组成的二维矩阵
heads = ['English', 'Mathematics', 'Physics'] # 表头,列名组成的列表
df_new = pd.DataFrame(data=X, columns=heads)
df_new.to_csv('./new_data.csv', decimal=',', index=False)