本文与NumPy图解 NumPy正确食用指南 搭配使用更好哦。
欢迎回来,我们在上两期都提及NumPy包,今天就推进一步,记录一下最近在资料中所收集的Pandas的用法及概念。
什么是Pandas
Pandas是一个基于Numpy专业的数据结构化分析工具,可用于数据挖掘和数据分析,同时也提供数据清洗功能。和Numpy一样,使用前需要载入:
import numpy as np
import pandas as pd
数据结构介绍
Pandas主要有两大利器:
Series
Series 是带标签的一维数组,可存储整数、浮点数、字符串、Python 对象等类型的数据。例如:
ndarry输入,支持切片
pd.Series(np.array(['a','b','c','d']))
#字典输入,支持索引提取值
pd.Series({'a': 0,'b': 2})
#指定index,若不指定则从0开始
pd.Series(data1,index=[5,6,7,8])
#多维数组时,index 长度必须与 data 长度一致
s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
a 0.469112
b -0.282863
c -1.509059
d -1.135632
e 1.212112
dtype: float64
Pandas 的索引值可以重复。不支持重复索引值的操作会触发异常。其原因主要与性能有关,有很多计算实例,比如 GroupBy 操作就不用索引。
DataFrame
DataFrame是Pandas中的一个表格型的数据结构,包含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等),DataFrame即有行索引也有列索引,可以被看做是由Series组成的字典。与 Series 一样,DataFrame 支持多种类型的输入数据:
一维 ndarray、列表、字典、Series 字典
二维 numpy.ndarray
结构多维数组或记录多维数组
Series
DataFrame
除了数据,还可以有选择地传递 index(行标签)和 columns(列标签)参数。传递了索引或列,就可以确保生成的 DataFrame 里包含索引或列。Series 字典加上指定索引时,会丢弃与传递的索引不匹配的所有数据。
#用 Series 字典或字典生成 DataFrame
d = {'one': pd.Series([1., 2., 3.], index=['a', 'b', 'c']),'two': pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
one two
a 1.0 1.0
b 2.0 2.0
c 3.0 3.0
d NaN 4.0
#用多维数组字典、列表字典生成 DataFrame
d = {'one': [1., 2., 3., 4.], 'two': [4., 3., 2., 1.]}
pd.DataFrame(d, index=['a', 'b', 'c', 'd'])
one two
0 1.0 4.0
1 2.0 3.0
2 3.0 2.0
3 4.0 1.0
#用结构多维数组或记录多维数组生成 DataFrame
data = np.zeros((2, ), dtype=[('A', 'i4'), ('B', 'f4'), ('C', 'a10')])
pd.DataFrame(data)
A B C
0 1 2.0 b'Hello'
1 2 3.0 b'World'
#index 和 columns 属性分别用于访问行、列标签:
pd.DataFrame(d, index=['d', 'b', 'a'], columns=['two', 'three'])
two three
d 4.0 NaN
b 2.0 NaN
a 1.0 NaN
生成的索引是每个 Series 索引的并集。先把嵌套字典转换为 Series。如果没有指定列,DataFrame 的列就是字典键的有序列表。DataFrame 的运作方式与 NumPy 二维数组不同。
相较于Series,DataFrame的基本操作就丰富一些,可以将 DataFrame理解为带索引的Series字典,那么也会有提取、设置、删除列的操作方式。
# 指定列
df["A"]
#获取值
df.iloc[0,0]
# 添加行/列
df.loc[3] = [10,11,12]
df["D"] = df.index
#指定插入的位置
df.insert(1, 'bar', df['one'])
#标量值以广播的方式填充列
df['foo'] = 'bar'
#删除列
del df['A']
# 切片行/列
df.iloc[0]
df.loc[:,"A"]
#检查重复值并保留一个
df.drop_duplicates(["A"], keep='last')
#重命名行列
df.rename(index = {0:1, 1:2, 2:3})
df.rename(columns = {"A":"col1", "B":"col2", "C":"col3", "D":"col4"}, inplace = True)
#判断缺失值
df.isnull()
#补充缺失值,指定列
df.fillna(value={"A":100})
#正则替换
df.replace('[A-Z]', 0, regex = True)
读写excel
从Excel文件读取数据:
pd.read_excel('foo.xlsx', 'Sheet1', index_col=None, na_values=['NA'])
Unnamed: 0 A B C D
0 2000-01-01 0.266457 -0.399641 -0.219582 1.186860
1 2000-01-02 -1.170732 -0.345873 1.653061 -0.282953
2 2000-01-03 -1.734933 0.530468 2.060811 -0.515536
3 2000-01-04 -1.555121 1.452620 0.239859 -1.156896
4 2000-01-05 0.578117 0.511371 0.103552 -2.428202
5 2000-01-06 0.478344 0.449933 -0.741620 -1.962409
6 2000-01-07 1.235339 -0.091757 -1.543861 -1.084753
.. ... ... ... ... ...
993 2002-09-20 -10.628548 -9.153563 -7.883146 28.313940
994 2002-09-21 -10.390377 -8.727491 -6.399645 30.914107
995 2002-09-22 -8.985362 -8.485624 -4.669462 31.367740
996 2002-09-23 -9.558560 -8.781216 -4.499815 30.518439
997 2002-09-24 -9.902058 -9.340490 -4.386639 30.105593
998 2002-09-25 -10.216020 -9.480682 -3.933802 29.758560
999 2002-09-26 -11.856774 -10.671012 -3.216025 29.369368
[1000 rows x 5 columns]
写入excel文件:
df.to_excel('foo.xlsx', sheet_name='Sheet1')
在翻查资料的时候,再记录一个用法:
类似于dplyr
的 mutate
,DataFrame 提供了 assign()
方法,可以利用现有的列创建新列。具体的例子如下:
iris = pd.read_csv('data/iris.data')
iris.head()
SepalLength SepalWidth PetalLength PetalWidth Name
0 5.1 3.5 1.4 0.2 Iris-setosa
1 4.9 3.0 1.4 0.2 Iris-setosa
2 4.7 3.2 1.3 0.2 Iris-setosa
3 4.6 3.1 1.5 0.2 Iris-setosa
4 5.0 3.6 1.4 0.2 Iris-setosa
(iris.assign(sepal_ratio=iris['SepalWidth'] / iris['SepalLength']).head())
SepalLength SepalWidth PetalLength PetalWidth Name sepal_ratio
0 5.1 3.5 1.4 0.2 Iris-setosa 0.686275
1 4.9 3.0 1.4 0.2 Iris-setosa 0.612245
2 4.7 3.2 1.3 0.2 Iris-setosa 0.680851
3 4.6 3.1 1.5 0.2 Iris-setosa 0.673913
4 5.0 3.6 1.4 0.2 Iris-setosa 0.720000
#同时支持传递带参数的函数
iris.assign(sepal_ratio=lambda x: (x['SepalWidth'] / x['SepalLength'])).head()
SepalLength SepalWidth PetalLength PetalWidth Name sepal_ratio
0 5.1 3.5 1.4 0.2 Iris-setosa 0.686275
1 4.9 3.0 1.4 0.2 Iris-setosa 0.612245
2 4.7 3.2 1.3 0.2 Iris-setosa 0.680851
3 4.6 3.1 1.5 0.2 Iris-setosa 0.673913
4 5.0 3.6 1.4 0.2 Iris-setosa 0.720000
除了上面对方法外,还有多种对数据的处理,例如运算:
df = pd.DataFrame(np.random.randn(10, 4), columns=['A', 'B', 'C', 'D'])
df2 = pd.DataFrame(np.random.randn(7, 3), columns=['A', 'B', 'C'])
df + df2
df - df.iloc[0]
还有时间序列、布尔运算、转置、使用NumPy函数等功能。有兴趣的小伙伴自行搜索哈。
参考资料 https://www.pypandas.cn/docs/getting_started/dsintro.html#dsintro https://www.bioinfo-scrounger.com/archives/858/猜你喜欢
三剑客 PyCharm使用 | 编程基础与规范代码 | 列表使用
元组拆包是个啥?| 字典与FASTA文件序列抽提
如何判断序列是否跨过剪切位点 | python3 脚本小实战
爬虫小测试 | 函数入门
如何优雅的数月饼 |为什么要使用函数
NCBI的文献搜索与影响因子和分区
类与对象
NumPy图解 |NumPy指南
最后友情宣传生信技能树
生物信息学“义诊”
生物信息学"拍卖会"
全国巡讲:R基础,Linux基础和RNA-seq实战演练 : 预告:12月28-30长沙站
广州珠江新城GEO数据挖掘滚动开班
DNA及RNA甲基化数据分析与课题设计