Pandas 数据处理基础

此为实验楼楼+机器学习前置课程Pandas 数据处理基础课程学习笔记

基于NumPy 开发

数据类型

  • Series(一维数组)
  • DataFrame(二维数组)
  • Panel(三维数组)
  • Panel4D(四维数组)
  • PanelND(更多维数组)

。其中 Series 和 DataFrame 应用的最为广泛,几乎占据了使用频率 90% 以上。


Series

数据结构

1
pandas.Series(data=None, index=None)
  • data 可以使字典,也可以是NumPy中的ndarray
  • index 为索引

初始化

1
2
3
4
5
6
7
8
9
10
11
12
%matplotlib inline
import pandas as pd

s = pd.Series({'a': 10, 'b': 20, 'c': 30})
s
# a 10
# b 20
# c 30
# dtype: int64

type(s)
# pandas.core.series.Series

使用 NumPy

1
2
3
4
5
6
7
8
9
10
import numpy as np
s = pd.Series(np.random.randn(5))
s

# 0 -1.479177
# 1 0.065918
# 2 -1.596897
# 3 -1.421155
# 4 -1.485562
# dtype: float64

DataFrame

它仿佛是由多个 Series 拼合而成。它和 Series 的直观区别在于,数据不但具有行索引,且具有列索引

基础结构

1
pandas.DataFrame(data=None, index=None, columns=None)

data 的数据类型

  • 一维数组、列表、字典或者 Series 字典。
  • 二维或者结构化的 numpy.ndarray
  • 一个 Series 或者另一个 DataFrame。

初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 1 Series
df = pd.DataFrame({'one': pd.Series([1,2,3]),
'two': pd.Series([4,5,6])})
df

# 2 字典
df = pd.DataFrame({'one': [1, 2, 3],
'two': [4, 5, 6]})

# 3 由字典数组生成
df = pd.DataFrame([{'one': 1, 'two': 4},
{'one': 2, 'two': 5},
{'one': 3, 'two': 6}])
df


# result:
# one two
# 0 1 4
# 1 2 5
# 2 3 6

用NumPy随机生成

1
2
3
4
5
pd.DataFrame(np.random.randint(5, size=(2, 4)))

# 0 1 2 3
# 0 0 1 1 3
# 1 3 3 2 1

数据读取

读取cvs数据

1
2
3
import pandas as pd
df = pd.read_csv("https://labfile.oss.aliyuncs.com/courses/906/los_census.csv")
df

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 读取前8个数据
df.head(10)

# 读取后7个数据
df.tail(7)

# 转换成NumPy数组
df.values

# 查看索引
df.index

# 查看列名
df.columns

# 查看形状
df.shape

数据选择

基于索引数字选择

选取前三行数据

1
df.iloc[:3]

选定一行

1
df.iloc[5]

df.iloc[][[行],[列]] 里面可以同时接受行和列的位置

选取1、3、5行

1
df.iloc[[1, 3, 5]]

选取2-4列

1
df.iloc[:, 1:4]

基于标签名选择

使用 df.loc

选择前三行

1
2
# 首尾都包括在内
df.loc[0:2]

选择1、3、5行

1
df.loc[[0, 2, 4]]

选择2-4列

1
2
# 这里第二行为列的名称
df.loc[:, 'Total Population':'Total Males']

选择1、3行和Median Age 后面的列

1
df.loc[[0, 2], 'Median Age':]

数据删减

.drop 开头的方法都与数据删减有关。

设定 labels 指定标签,通过 axis 指定按列或按行删除

1
2
# 删除指定标签下所有的数据
df.drop(labels=['Median Age', 'Total Males'], axis=1)

数据去重

1
df.drop_duplicates()

删除数据中空缺的数据列和数据行

1
df.dropna()

数据填充

我们一般不会乱填数据,而更多的是对缺失值进行填充。存在但明显不正确的数据也被归为缺失值一类

检查缺失值

将不同类型数据的缺失均采用 NaN 标记,时间戳缺失也用这个来表示。使用函数 isna()notna() 来判断

首先先认为生成一组含缺失值的数据

1
2
3
4
5
6
7
8
9
10
# 9行5列,列名分别为A、B、C、D、E
df = pd.DataFrame(np.random.rand(9,5), columns=list('ABCDE'))
# 将新列Time作为第一列
df.insert(value=pd.Timestamp('2017-10-1'), loc=0, column='Time')

# 将 1, 3, 5 列的 1,3,5 行置为缺失值
df.iloc[[x for x in range(1, 8, 2)], [y for y in range(0, 5, 2)]] = np.nan

# 将 2, 4, 6 列的 2,4,6 行置为缺失值
df.iloc[[x for x in range(2, 9, 2)], [y for y in range(1, 6, 2)]] = np.nan

执行 df.isna() 即可确认整个数据表的缺失值情况

将缺失值都填充为一个值

1
df.fillna(0)

使用缺失值前面的值进行填充

1
df.fillna(method='pad')

使用缺失值后面的值进行填充

1
df.fillna(method='bfill')

出现连续缺失值的情况,使用 limit 参数设置最多连续填充的数量

1
df.fillna(method='pad', limit=1)  # 最多填充一项

使用平均值填充

1
2
# 对 C 列和 E 列用平均值填充。
df.fillna(df.mean()['C':'E'])

插值填充

借助于一个函数(线性或非线性),再根据已知数据去求解未知数据的值。interpolate()

生成测试数据

1
2
df = pd.DataFrame({'A': [1.1, 2.2, np.nan, 4.5, 5.7, 6.9],
'B': [.21, np.nan, np.nan, 3.1, 11.7, 13.2]})

使用默认的线性插值

1
2
df_interpolate = df.interpolate()
df_interpolate

插值后,其符合变化趋势

  1. 如果你的数据增长速率越来越快,可以选择 method='quadratic'二次插值。
  2. 如果数据集呈现出累计分布的样子,推荐选择 method='pchip'
  3. 如果需要填补缺省值,以平滑绘图为目标,推荐选择 method='akima'