Pandas 初探 快速上手 天下武功唯快不破
Pandas 是一种建立在 python 语言之上,开源的数据分析和处理工具,具有快速、强大、灵活的优点,有很多机器学习框架都支持将 pandas 的数据结构作为输入。我粗浅的学了一点,本文就是学习笔记。
引入依赖
首先安装 pandas 和 numpy:
pip install pandas numpy
然后引入:
import pandas as pd
import numpy as py
# 下面代码打印 pandas 的版本
print(pd.__version__)
# 1.0.1
基本数据结构
pandas 主要有两种数据结构:
DataFrame
:一种类似数据表格的结构,由行和列构成,每列都有一个名称。Series
:DateFrame
的单一列的数据结构。每个DataFrame
可以包含多个Series
,每个Series
都有一个名称。
创建 DataFrame
和 Series
:
# 创建 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 伞伞 男
假如创建 DataFrame
的 Series
长度不一致,缺失的部分会用 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 的
DataFrame
和Series
数据结构 - 从文件导入数据到
DataFrame
DataFrame
和Series
数据的创建、访问和处理
内容不多,但作为一款工具,不是一门理论,不是通读文档就能熟练的,只有多用才能生巧。现在掌握基本的用法,比较高级技巧待到用时查查文档,用几次就熟了,快速使用工具解决现有问题才是最重要的。