欢迎关注”生信修炼手册”!
pandas基于numpy进行开发,是python数据分析的核心包,针对结构化数据,提供了一系列灵活且强大的数据分析功能。在pandas中,提供了以下两种基本的数据结构
Series
DataFrame
熟悉R的朋友,理解这两个概念非常简单,Series是一维结构,且带有标签,其中的元素都是同种类型,类比R语言中的向量,而DataFrame从名字看更加直观,类比R语言中的data.frame数据框,DataFrame的每一列其实就是一个Series对象。Series对象示例如下
>>> import pandas as pd
>>> import numpy as np
>>> s = pd.Series([1, 2, 3, np.nan, 5])
>>> s
0 1.0
1 2.0
2 3.0
3 NaN
4 5.0
dtype: float64
# name参数指定series的名称
>>> s = pd.Series(data=[1, 2, 3, np.nan, 5],name='A')
>>> s
0 1.0
1 2.0
2 3.0
3 NaN
4 5.0
Name: A, dtype: float64
# data参数指定数据
# index参数指定标签
# 默认标签类似数组的下标索引
>>> s = pd.Series(data=[1, 2, 3, np.nan, 5],index=['A','B','C', 'D', 'E'])
>>> s
A 1.0
B 2.0
C 3.0
D NaN
E 5.0
dtype: float64
# 通过下标或者标签名字可以访问其中的元素
>>> s[0]
1.0
>>> s['A']
1.0
pandas中的缺失值用NaN来表示,DataFrame对象示例如下
>>> df = pd.DataFrame(np.random.rand(5,5))
>>> df
0 1 2 3 4
0 0.163853 0.478228 0.096328 0.390939 0.528931
1 0.483235 0.964965 0.946697 0.617395 0.149224
2 0.720721 0.559443 0.346435 0.486527 0.390008
3 0.711582 0.519249 0.005936 0.866858 0.836957
4 0.897743 0.972732 0.537487 0.276900 0.948538
# index 参数指定行标签, 默认值为从0开始的下标
# columns参数指定列标签,默认值为从0开始的下标
>>> df = pd.DataFrame(np.random.rand(5,5),index=['A1','A2','A3','A4','A5'], columns=['A','B','C','D','E'])
>>> df
A B C D E
A1 0.418639 0.536177 0.575832 0.836404 0.061494
A2 0.911322 0.062853 0.840488 0.051903 0.559243
A3 0.213690 0.797220 0.891103 0.232472 0.128613
A4 0.238780 0.397183 0.289779 0.370459 0.264069
A5 0.575950 0.311570 0.215405 0.793575 0.994698
# 通过列标签访问对应的列
# 输出内容就是一个Series对象
>>> df['A']
A1 0.418639
A2 0.911322
A3 0.213690
A4 0.238780
A5 0.575950
Name: A, dtype: float64
>>> df.A
A1 0.418639
A2 0.911322
A3 0.213690
A4 0.238780
A5 0.575950
Name: A, dtype: float64
>>> df.get('A')
A1 0.700150
A2 0.903883
A3 0.015775
A4 0.006292
A5 0.239663
Name: A, dtype: float64
DataFrame是pandas操作的核心, 支持异构数据,即不同的列对应不同的数据类型,示例如下
>>> df = pd.DataFrame({'A':[1, 2, 3, 4], 'B':['Andy', 'Rose', 'June', 'July']})
>>> df
A B
0 1 Andy
1 2 Rose
2 3 June
3 4 July
这样的结构更具包容性,适合处理类似excel文件内容的数据。DataFrame的基本操作方法如下
1. 基本属性
DataFrame也具有numpy数组类似的维度,形状等属性,示例如下
# 维度
>>> df.ndim
2
# 数值总数
>>> df.size
25
# 每个维度的尺寸
>>> df.shape
(5, 5)
# 每一列的数据类型
>>> df.dtypes
A float64
B float64
C float64
D float64
E float64
dtype: object
# 数据框中的所有值
>>> df.values
array([[0.70015033, 0.12960382, 0.871099 , 0.86146233, 0.33794277],
[0.90388331, 0.40102109, 0.3046794 , 0.40498749, 0.55128064],
[0.01577541, 0.70574337, 0.99492806, 0.28706767, 0.62816839],
[0.00629215, 0.488683 , 0.5385188 , 0.15954784, 0.15361006],
[0.23966275, 0.54685001, 0.32405166, 0.81499923, 0.53875313]])
# 数据框的行和列标签
>>> df.axes
[Index(['A1', 'A2', 'A3', 'A4', 'A5'], dtype='object'), Index(['A', 'B', 'C', 'D', 'E'], dtype='object')]
# 行标签
>>> df.index
Index(['A1', 'A2', 'A3', 'A4', 'A5'], dtype='object')
# 行标签
>>> df.keys()
Index(['A', 'B', 'C', 'D', 'E'], dtype='object')
# 列标签
>>> df.columns
Index(['A', 'B', 'C', 'D', 'E'], dtype='object')
2. 查看内容
实际中的数据框框往往包含非常多的行和列,通过head和tail方法可以简单查看头尾的几行,示例如下
>>> df.head(n=1)
A B C D E
A1 0.418639 0.536177 0.575832 0.836404 0.061494
>>> df.head(n=2)
A B C D E
A1 0.418639 0.536177 0.575832 0.836404 0.061494
A2 0.911322 0.062853 0.840488 0.051903 0.559243
>>> df.tail(n=3)
A B C D E
A3 0.21369 0.797220 0.891103 0.232472 0.128613
A4 0.23878 0.397183 0.289779 0.370459 0.264069
A5 0.57595 0.311570 0.215405 0.793575 0.994698
3. 访问元素
基本的访问元素通过行列的索引或标签来进行,示例如下
# 根据行和列的标签来访问对应元素
>>> df.at['A1', 'A']
0.7001503320168031
# 根据行和列的索引来访问对应元素
>>> df.iat[0, 0]
0.7001503320168031
# 根据行和列的标签来访问对应元素
>>> df.loc['A1','A']
0.7001503320168031
# 根据行和列的索引来访问对应元素
>>> df.iloc[0,0]
0.7001503320168031
4. 二元运算
对两个数据框进行运算,常用的加减乘除算数运算,示例如下
>>> a = pd.DataFrame(np.random.rand(4,4))
>>> b = pd.DataFrame(np.random.rand(4,4))
# 加法
>>> a.add(b)
0 1 2 3
0 1.357769 1.684003 0.500581 0.814958
1 0.900818 1.138432 1.898524 1.000987
2 1.105629 1.076538 0.729917 0.682571
3 0.564739 1.017597 0.864299 0.801017
# 等价二元操作符
>>> a + b
0 1 2 3
0 1.357769 1.684003 0.500581 0.814958
1 0.900818 1.138432 1.898524 1.000987
2 1.105629 1.076538 0.729917 0.682571
3 0.564739 1.017597 0.864299 0.801017
# 减法
>>> a.sub(b)
# 乘法
>>> a.mul(b)
# 除法
>>> a.div(b)
逻辑运算,示例如下
# 大于
>>> a.gt(b)
0 1 2 3
0 True True False False
1 False False False False
2 True False True True
3 True False False True
# 小于
>>> a.lt(b)
# 小于等于
>>> a.le(b)
# 大于等于
>>> a.ge(b)
# 等于
>>> a.eq(b)
# 不等于
>>> a.ne(b)
5. 合并数据框
# append 函数,将新的数据框追加为行
>>> a = pd.DataFrame(np.random.rand(2, 2), columns=['A', 'B'])
>>> b = pd.DataFrame(np.random.rand(2, 2), columns=['A', 'B'])
>>> a
A B
0 0.529614 0.712904
1 0.969706 0.943299
>>> b
A B
0 0.626073 0.293426
1 0.952565 0.251707
>>> a.append(b)
A B
0 0.529614 0.712904
1 0.969706 0.943299
0 0.626073 0.293426
1 0.952565 0.251707
# assign 函数,为数据框新增列
>>> a.assign(C=pd.Series([1,2]))
A B C
0 0.529614 0.712904 1
1 0.969706 0.943299 2
# 多列就是多个关键词参数
>>> a.assign(C=pd.Series([1,2]),D=[1,2])
A B C D
0 0.529614 0.712904 1 1
1 0.969706 0.943299 2 2
DataFrame相比numpy ndarray, 更加嵌合实际数据,用pandas来分析实际数据更加的便利,pandas中也提供了很多的统计分析函数以及灵活的操作方法,更多的技巧后续在详细介绍。
·end·
—如果喜欢,快分享给你的朋友们吧—
原创不易,欢迎收藏,点赞,转发!生信知识浩瀚如海,在生信学习的道路上,让我们一起并肩作战!
本公众号深耕耘生信领域多年,具有丰富的数据分析经验,致力于提供真正有价值的数据分析服务,擅长个性化分析,欢迎有需要的老师和同学前来咨询。
更多精彩
KEGG数据库,除了pathway你还知道哪些
全网最完整的circos中文教程
DNA甲基化数据分析专题
突变检测数据分析专题
mRNA数据分析专题
lncRNA数据分析专题
circRNA数据分析专题
miRNA数据分析专题
单细胞转录组数据分析专题
chip_seq数据分析专题
Hi-C数据分析专题
HLA数据分析专题
TCGA肿瘤数据分析专题
基因组组装数据分析专题
CNV数据分析专题
GWAS数据分析专题
2018年推文合集
2019年推文合集
写在最后
转发本文至朋友圈,后台私信截图即可加入生信交流群,和小伙伴一起学习交流。
扫描下方二维码,关注我们,解锁更多精彩内容!
一个只分享干货的
生信公众号