zoukankan      html  css  js  c++  java
  • Pandas 学习笔记

    Pandas 的基本概念就是 DataFrame,所有属性和操作都是围绕它而来。

    Padans 中的每一列叫做 Series,每一个 Series 中的数据类型要保持一致,但是 DataFrame 中的 Series 的类型可以不一样。

    一般 Python 三剑客的导入的方法如下:

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    

    创建 Series 和索引

    序列 = 数据 + 索引 + 序列名 + 数据类型

    >>> s_age = pd.Series(data=[1, 2, 3, 4], index=["a", "b", "c", "d"], name="mySeries", dtype=np.int32)
    >>> s_age
    a    1
    b    2
    c    3
    d    4
    Name: mySeries, dtype: int32
    >>> s_age.reindex(['a','b','e']) # 重排
    a    1.0
    b    2.0
    e    NaN
    Name: mySeries, dtype: float64
    >>> s_age[0]
    1
    >>> s_age[1:2]
    b    2
    Name: mySeries, dtype: int32
    >>> s_age[1:2]=22
    >>> s_age
    a     1
    b    22
    c     3
    d     4
    Name: mySeries, dtype: int32
    >>> s_age["a"]
    1
    

    创建 DataFrame

    用 Series 创建

    >>> s1 = pd.Series(data=["M", "F", "M", "F"], index=["a", "b", "c", "d"], name="sex")
    >>> s2 = pd.Series(data=[21, 22, 23, 24], index=["a", "b", "c", "d"], name="age")
    >>> df = pd.DataFrame({'sex': s1.astype("category"), 'age': s2})
    >>> df
       age sex
    a   21   M
    b   22   F
    c   23   M
    d   24   F
    

    从文件中读取

    包括但不限于 csv,数据库。

    iris=pd.read_csv('https://raw.github.com/pydata/pandas/master/pandas/tests/data/iris.csv', sep=',')
    

    查看属性

    >>> df.index # 行名
    Index(['a', 'b', 'c', 'd'], dtype='object')
    >>> df.columns # 列名
    Index(['age', 'sex'], dtype='object')
    >>> df.dtypes # 列属性,也就是 Series 类型
    age       int64
    sex    category
    dtype: object
    

    head 和 tail 就和 Linux 下面的 haed 和 tail 命令类似。

    >>> df.head()
       age sex
    a   21   M
    b   22   F
    c   23   M
    d   24   F
    >>> df.tail()
       age sex
    a   21   M
    b   22   F
    c   23   M
    d   24   F
    >>> df.describe()
                 age
    count   4.000000
    mean   22.500000
    std     1.290994
    min    21.000000
    25%    21.750000
    50%    22.500000
    75%    23.250000
    max    24.000000
    

    聚合

    就和 sql 中的 groupby 类似。

    >>> df.groupby([df["sex"]]).agg({"age": ["sum", "mean"]})
        age
        sum mean
    sex
    F    46   23
    M    44   22
    

    排序

    可以指定排序的依据,是否倒序等等。

    >>> df.sort_index(ascending=False)
       age sex
    d   24   F
    c   23   M
    b   22   F
    a   21   M
    >>> df.sort_values(by="age", ascending=False)
       age sex
    d   24   F
    c   23   M
    b   22   F
    a   21   M
    

    透视

    >>> df
       age sex  sorce
    a   21   M     11
    b   22   F     12
    c   23   M     13
    d   24   F     14
    >>> df.pivot_table(index=['age'], columns=['sex'], values=['sorce'], aggfunc=[len, np.mean,np.sum],margins=True, fill_value=0)
          len         mean           sum
        sorce        sorce         sorce
    sex     F  M All     F   M All     F   M All
    age
    21      0  1   1     0  11  11     0  11  11
    22      1  0   1    12   0  12    12   0  12
    23      0  1   1     0  13  13     0  13  13
    24      1  0   1    14   0  14    14   0  14
    All     2  2   4    13  12  12    26  24  50
    

    索引

    也就是定位元素。

    >>> df[1:3] # 切片
       age sex  sorce
    b   22   F     12
    c   23   M     13
    >>> df[df.sorce>12] # bool 索引
       age sex  sorce
    c   23   M     13
    d   24   F     14
    >>> df.query('sorce>12') # sql 索引
       age sex  sorce
    c   23   M     13
    d   24   F     14
    >>> df = pd.DataFrame(np.arange(10).reshape(-1, 2), columns=['A', 'B'])
    >>> df.where(df.A>2, 10) # 不满足条件的填充
        A   B
    0  10  10
    1  10  10
    2   4   5
    3   6   7
    4   8   9
    >>> df
       A  B
    a  0  1
    b  2  3
    c  4  5
    d  6  7
    e  8  9
    >>> df.A # 选择列
    a    0
    b    2
    c    4
    d    6
    e    8
    Name: A, dtype: int64
    >>> df[['A', 'B']] # 选择多列
       A  B
    a  0  1
    b  2  3
    c  4  5
    d  6  7
    e  8  9
    >>> df.loc[['a','b'], ['A','B']] # 选择行与列
       A  B
    a  0  1
    b  2  3
    >>> df.iloc[1:3, 0:2] # 根据行列下标来选择
       A  B
    b  2  3
    c  4  5
    

    合并数据

    # axis 设置纬度,join 指定合并方式,参考 sql 的连接
    pd.concat([df1,df2],axis=0,join='outer')
    # merge 就和 sql 的 join 类似
    pd.merge(df1,df2,on=['age'],how='left')
    

    更多参数和直观的体现可以参考 Merge, join, and concatenate

    采样

    df1.sample(n=100, weights='age',axis=0, replace=True)
    

    sklearn 也有对 DataFrame 进行 shuffle 的函数。

    https://www.ouyangsong.com/posts/19907/

    欧阳松 (@ouyangsong) 的博客,关于算法,编程语言以及黑客精神的笔记,记录了程序员的修炼之道。
  • 相关阅读:
    PHP-redis中文文档
    非关系型数据库Redis学习(3)
    非关系型数据库Redis学习(1)
    【Android】找不到类
    【leetcode】删除单向链表的节点
    【上海交大oj】数学题3(数位dp)
    【上海交大oj】括号匹配加强 (动态规划)
    【上海交大oj】纸来纸去(动态规划)
    【上海交大oj】1053 二哥的内存
    【上海交大oj】畅畅的牙签袋(改)(枚举+模拟)
  • 原文地址:https://www.cnblogs.com/ouyangsong/p/9348189.html
Copyright © 2011-2022 走看看