pandas loc 正则匹配_十分钟入门潘大师(Pandas)

本文与NumPy图解  NumPy正确食用指南 搭配使用更好哦。

欢迎回来,我们在上两期都提及NumPy包,今天就推进一步,记录一下最近在资料中所收集的Pandas的用法及概念。

2104efa710af0d51cc41f498a93c9ff0.png

什么是Pandas

Pandas是一个基于Numpy专业的数据结构化分析工具,可用于数据挖掘和数据分析,同时也提供数据清洗功能。和Numpy一样,使用前需要载入:

import numpy as np
import pandas as pd

数据结构介绍

Pandas主要有两大利器:

  1. 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 操作就不用索引。

  1. 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甲基化数据分析与课题设计

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值