Pandas 是一种建立在 python 语言之上,开源的数据分析和处理工具,具有快速、强大、灵活的优点,有很多机器学习框架都支持将 pandas 的数据结构作为输入。我粗浅的学了一点,本文就是学习笔记。

Pandas logo

引入依赖

首先安装 pandas 和 numpy:

pip install pandas numpy

然后引入:

import pandas as pd
import numpy as py

# 下面代码打印 pandas 的版本
print(pd.__version__)
# 1.0.1

基本数据结构

pandas 主要有两种数据结构:

  • DataFrame:一种类似数据表格的结构,由行和列构成,每列都有一个名称。
  • SeriesDateFrame 的单一列的数据结构。每个 DataFrame 可以包含多个 Series,每个 Series 都有一个名称。

创建 DataFrameSeries

# 创建 Series
nickname = pd.Series(['依依', '尔尔', '伞伞'])
sex = pd.Series(['女', '男', '男'])
print(nickname)
# 0    依依
# 1    尔尔
# 2    伞伞

# 创建 DataFrame
person_info = pd.DataFrame({ 'Nickname': nickname, 'Sex': sex })
print(person_info)
#   Nickname Sex
# 0     依依   女
# 1     尔尔   男
# 2     伞伞   男

假如创建 DataFrameSeries 长度不一致,缺失的部分会用 NaN 替代:

# 创建 Series
nickname = pd.Series(['依依', '尔尔', '伞伞'])
sex = pd.Series(['女', '男'])  # 缺少一个字段

# 创建 DataFrame
person_info = pd.DataFrame({ 'Nickname': nickname, 'Sex': sex })
print(person_info)
#   Nickname Sex
# 0     依依   女
# 1     尔尔   男
# 2     伞伞  NaN

当然,可以读取文件批量导入 DataFrame,以 csv 文件为例:

person_info = pd.read_csv('path/to/your_csv_name.csv', sep=",")
# 下面代码可以打印出一些有趣的统计数据
print(person_info.describe())
#        nickname    sex
# count     10000  10000
# unique    10000      2
# top       小仙女      女
# freq          1   6039

除了 csv,还支持各种各样的格式:Pandas API 文档 Input/Output

读取后可以用 head 方法来查看前几条数据:

# 接受一个 int 参数 n,表示查看 n 条数据,默认为 5
person_info.head()

pandas 还有一个强大的功能,可以根据某一类型为 int 的 Series 绘制直方图:

# bins 设置直方图矩形的数量
# hist 方法还接收 DataFrame.plot 的参数来定义图表的样式
person_info.hist('Age', bins=15)

数据访问

pandas 提供非常人性化数据操作指令,就和操作 dict 或者 list 一样。

要获取一个特定的 Series

person_info['Nickname']
# 0    依依
# 1    尔尔
# 2    伞伞
# Name: Nickname, dtype: object

获取 Series 内的某个值:

# 获取第 2 个值
person_info['Nickname'][1]
# 尔尔

如果给 Series 建立了索引会更方便、更直观:

# 建立索引
nickname = pd.Series(['依依', '尔尔', '伞伞'], index=['一班', '二班', '三班'])
# 获取二班的值
nickname['二班']
# 尔尔

只想要 n - m 行数据:

type(person_info[n:m])
# <class 'pandas.core.frame.DataFrame'>

query 方法查询满足特定条件的数据:

n = 10
df = pd.DataFrame(np.random.rand(n, 3), columns=list('abc'))
#           a         b         c
# 0  0.438921  0.118680  0.863670
# 1  0.138138  0.577363  0.686602
# 2  0.595307  0.564592  0.520630
# 3  0.913052  0.926075  0.616184
# 4  0.078718  0.854477  0.898725
# 5  0.076404  0.523211  0.591538
# 6  0.792342  0.216974  0.564056
# 7  0.397890  0.454131  0.915716
# 8  0.074315  0.437913  0.019794
# 9  0.559209  0.502065  0.026437

df.query('(a < b) & (b < c)')
#           a         b         c
# 1  0.138138  0.577363  0.686602
# 4  0.078718  0.854477  0.898725
# 5  0.076404  0.523211  0.591538
# 7  0.397890  0.454131  0.915716

# 等价的纯 python 操作
df[(df['a'] < df['b']) & (df['b'] < df['c'])]

lookup 方法提取一组数据集合,它接受 2 组相同大小的数组为参数,分别为行标签和列标签,结果返回一个 numpy 数组:

# 提取主对角线元素集合
df = pd.DataFrame(np.random.rand(5, 5), columns=list('12345'), index=list('ABCDE'))
#           1         2         3         4         5
# A  0.196185  0.223263  0.498430  0.604401  0.454253
# B  0.796094  0.765410  0.281985  0.751875  0.949642
# C  0.069508  0.543533  0.706640  0.172120  0.000006
# D  0.640174  0.664538  0.719519  0.783656  0.706565
# E  0.576069  0.032542  0.249479  0.034244  0.286846

df.lookup(list('ABCDE'), list('12345'))
# [0.19618529 0.76541006 0.70664015 0.78365593 0.28684642]

数据操作

简单的 Series 列操作:

age = pd.Series([20, 25, 23])
age / 10
# 0    2.0
# 1    2.5
# 2    2.3
# dtype: float64

numpy 是一种进行科学运算的 python 工具包,pandas 的 Series 可作为大部分 numpy 方法的参数:

np.log(age)
# 0    2.995732
# 1    3.218876
# 2    3.135494
# dtype: float64

apply 方法进行 Series 单列转换,类似于 Javascript 的 map 函数,接受一个 lambda 作为参数:

sex.apply(lambda s: s == '男')
# 0    False
# 1     True
# 2     True
# dtype: bool

DataFrame 的操作也非常简单,下面代码会添加 2 组 Series

person_info['Age'] = pd.Series([16, 20, 18])
person_info['Is Adult'] = person_info['Age'] >= 18
#    Nickname  Sex  Age  Is Adult
# 0       依依   女   16     False
# 1       尔尔   男   20      True
# 2       伞伞   男   18      True

总结

Pandas 的初探到这里为止,总结一下学到了什么:

  • 大致了解了 pandas 的 DataFrameSeries 数据结构
  • 从文件导入数据到 DataFrame
  • DataFrameSeries 数据的创建、访问和处理

内容不多,但作为一款工具,不是一门理论,不是通读文档就能熟练的,只有多用才能生巧。现在掌握基本的用法,比较高级技巧待到用时查查文档,用几次就熟了,快速使用工具解决现有问题才是最重要的。