玩命加载中 . . .

常用技巧-pandas包


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]

先来看一下这四种基本形式的参数下,对应的返回结果。

  1. 单标签

    # 取指定行数据
    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
    '''
  2. 标签列表

    # 取指定行数据
    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
    '''
  3. 标签切片

    # 取指定行数据
    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
    '''
  4. 布尔值列表

    # 取指定行数据
    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)

文章作者: 鹿卿
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 鹿卿 !
评论
  目录