Pandas 学习笔记

Pandas

第一章 概述

1.1 简单概述

​ Pandas 是一个python的包,提供快速、灵活和富有表现力的数据结构,旨在使“关系”或“标记”数据的使用既简单又直观。

​ Pandas 非常适合许多不同类型的数据:

  1. 具有异构类型列的表格数据,如SQL表或Excel电子表格
  2. 有序和无序(不一定是固定频率)时间序列数据
  3. 具有行和列表前的任意矩形数据(均匀类型或异构)
  4. 任何其他形式的观察/统计数据集,实际上不需要将数据标记为放置在Pandas数据结构中

1.2 适用pandas的任务

  1. 在浮点和非浮点数据中轻松处理缺失数据(表示为Nan)
  2. 大小可变性:可以从DataFrame和更高维度的对象中插入和删除
  3. 自动和显式数据对齐:对象可以明确地与一组标签对齐,或者用户可以简单地忽略标签,让Series,Dataframe等在计算中自动对齐数据
  4. 强大、灵活的组(group by)功能,可对数据集执行拆分应用组合操作,用于聚合和转换数据
  5. 轻松将其他Python和Numpy数据结构中的不规则,不同索引数据转换为dataframe对象
  6. 基于智能标签的切片、花式索引和子集大数据集
  7. 直观合并和加入数据集
  8. 灵活的重塑和数据集的旋转
  9. 轴的分层标记(每个刻度可能有多个标签)
  10. 强大的io工具,用于从平面文件(csv和分隔)、Excel文件、数据库以及能从超快的HDFS格式中保存或加载数据
  11. 特定时间序列功能:日期范围生成和频率转换、移动窗口统计、移动窗口线性回归、日期转换和滞后

1.3 数据结构

维数 名称 描述
1 Series 可以看作标签(默认是整数序列RangeIndex;可以重复)的一维数组(同类型),是scalars的结合,同时也是dataframe的元素
2 DataFrame 一般是二维标签,尺寸可变的表格结构,具有潜在的异质型列

第二种 Pandas入门

2.1.1 创键对象

  1. 通过传入一些值的列表来创建一个Series,Pandas会自动创键一个默认的索引

    import pandas as pd
    import numpy as np
    s = pd.Series([1,2,3,5,np.nan,6,7])
    print(s)
    输出结构
    0    1.0
    1    2.0
    2    3.0
    3    5.0
    4    NaN
    5    6.0
    6    7.0
    dtype: float64
    
  2. 通过传递带有日期时间索引和带有标签列的Numpy数组来创建Dataframe

    import pandas as pd
    import numpy as np
    datas = pd.date_range('20190101',periods=6)
    print(datas)
    输出结果
    DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
                   '2019-01-05', '2019-01-06'],
                  dtype='datetime64[ns]', freq='D')
    In [7]: df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
    
    In [8]: df
    Out[8]: 
                       A         B         C         D
    2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
    2013-01-02  1.212112 -0.173215  0.119209 -1.044236
    2013-01-03 -0.861849 -2.104569 -0.494929  1.071804
    2013-01-04  0.721555 -0.706771 -1.039575  0.271860
    2013-01-05 -0.424972  0.567020  0.276232 -1.087401
    2013-01-06 -0.673690  0.113648 -1.478427  0.524988
    
  3. 通过传递可以转换为类似Series的dict对象来创建Dataframe

    In [9]: df2 = pd.DataFrame({'A': 1.,
       ...:                     'B': pd.Timestamp('20130102'),
       ...:                     'C': pd.Series(1, index=list(range(4)), dtype='float32'),
       ...:                     'D': np.array([3] * 4, dtype='int32'),
       ...:                     'E': pd.Categorical(["test", "train", "test", "train"]),
       ...:                     'F': 'foo'})
       ...: 
    
    In [10]: df2
    Out[10]: 
         A          B    C  D      E    F
    0  1.0 2013-01-02  1.0  3   test  foo
    1  1.0 2013-01-02  1.0  3  train  foo
    2  1.0 2013-01-02  1.0  3   test  foo
    3  1.0 2013-01-02  1.0  3  train  foo
    
  4. Dataframe 的列具有不同的数据类型

    In [11]: df2.dtypes
    Out[11]: 
    A           float64
    B    datetime64[ns]
    C           float32
    D             int32
    E          category
    F            object
    dtype: object
    

2.2 查看数据

  1. 查看头部和尾部数据

    In [13]: df.head()
    Out[13]: 
                       A         B         C         D
    2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
    2013-01-02  1.212112 -0.173215  0.119209 -1.044236
    2013-01-03 -0.861849 -2.104569 -0.494929  1.071804
    2013-01-04  0.721555 -0.706771 -1.039575  0.271860
    2013-01-05 -0.424972  0.567020  0.276232 -1.087401
    
    In [14]: df.tail(3)
    Out[14]: 
                       A         B         C         D
    2013-01-04  0.721555 -0.706771 -1.039575  0.271860
    2013-01-05 -0.424972  0.567020  0.276232 -1.087401
    2013-01-06 -0.673690  0.113648 -1.478427  0.524988
    
  2. 显示索引、列、和底层Numpy数据

    In [15]: df.index
    Out[15]: 
    DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
                   '2013-01-05', '2013-01-06'],
                  dtype='datetime64[ns]', freq='D')
    
    In [16]: df.columns
    Out[16]: Index(['A', 'B', 'C', 'D'], dtype='object')
    
  3. 转置数据

    In [20]: df.T
    Out[20]: 
       2013-01-01  2013-01-02  2013-01-03  2013-01-04  2013-01-05  2013-01-06
    A    0.469112    1.212112   -0.861849    0.721555   -0.424972   -0.673690
    B   -0.282863   -0.173215   -2.104569   -0.706771    0.567020    0.113648
    C   -1.509059    0.119209   -0.494929   -1.039575    0.276232   -1.478427
    D   -1.135632   -1.044236    1.071804    0.271860   -1.087401    0.524988
    
  4. 按轴排序

    In [21]: df.sort_index(axis=1, ascending=False)
    Out[21]: 
                       D         C         B         A
    2013-01-01 -1.135632 -1.509059 -0.282863  0.469112
    2013-01-02 -1.044236  0.119209 -0.173215  1.212112
    2013-01-03  1.071804 -0.494929 -2.104569 -0.861849
    2013-01-04  0.271860 -1.039575 -0.706771  0.721555
    2013-01-05 -1.087401  0.276232  0.567020 -0.424972
    2013-01-06  0.524988 -1.478427  0.113648 -0.673690
    
  5. 按值排序

    In [22]: df.sort_values(by='B')
    Out[22]: 
                       A         B         C         D
    2013-01-03 -0.861849 -2.104569 -0.494929  1.071804
    2013-01-04  0.721555 -0.706771 -1.039575  0.271860
    2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
    2013-01-02  1.212112 -0.173215  0.119209 -1.044236
    2013-01-06 -0.673690  0.113648 -1.478427  0.524988
    2013-01-05 -0.424972  0.567020  0.276232 -1.087401
    

2.3 选择数据

`提醒

虽然用于选择和赋值的标准Python / Numpy表达式非常直观,并且便于交互工作,但是对于生产环境的代码,我们推荐优化的Pandas数据访问方法.at、.iat、.loc和.iloc。

2.3.1 获取
  1. 选择一个列,产生一个Series相当于“df.A"

    In [23]: df['A']
    Out[23]: 
    2013-01-01    0.469112
    2013-01-02    1.212112
    2013-01-03   -0.861849
    2013-01-04    0.721555
    2013-01-05   -0.424972
    2013-01-06   -0.673690
    Freq: D, Name: A, dtype: float6
    
  2. 通过[],对数据进行切片

    In [24]: df[0:3]
    Out[24]: 
                       A         B         C         D
    2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
    2013-01-02  1.212112 -0.173215  0.119209 -1.044236
    2013-01-03 -0.861849 -2.104569 -0.494929  1.071804
    
    In [25]: df['20130102':'20130104']
    Out[25]: 
                       A         B         C         D
    2013-01-02  1.212112 -0.173215  0.119209 -1.044236
    2013-01-03 -0.861849 -2.104569 -0.494929  1.071804
    2013-01-04  0.721555 -0.706771 -1.039575  0.271860
    
2.3.2 按标签选择
  1. 通过标签获取一行数据

    In [26]: df.loc[dates[0]]
    Out[26]: 
    A    0.469112
    B   -0.282863
    C   -1.509059
    D   -1.135632
    Name: 2013-01-01 00:00:00, dtype: float64
    
  2. 通过标签在多个轴上选择数据

    In [27]: df.loc[:, ['A', 'B']]
    Out[27]: 
                       A         B
    2013-01-01  0.469112 -0.282863
    2013-01-02  1.212112 -0.173215
    2013-01-03 -0.861849 -2.104569
    2013-01-04  0.721555 -0.706771
    2013-01-05 -0.424972  0.567020
    2013-01-06 -0.673690  0.113648
    
  3. 通过标签同时在两个轴上切片

    In [28]: df.loc['20130102':'20130104', ['A', 'B']]
    Out[28]: 
                       A         B
    2013-01-02  1.212112 -0.173215
    2013-01-03 -0.861849 -2.104569
    2013-01-04  0.721555 -0.706771
    
2.3.3 按位置选择
  1. 通过传递的整数的位置选择

    In [32]: df.iloc[3]
    Out[32]: 
    A    0.721555
    B   -0.706771
    C   -1.039575
    D    0.271860
    Name: 2013-01-04 00:00:00, dtype: float64
    
  2. 通过整数切片,类似于numpy

    In [33]: df.iloc[3:5, 0:2]
    Out[33]: 
                       A         B
    2013-01-04  0.721555 -0.706771
    2013-01-05 -0.424972  0.567020
    
  3. 通过传递整数的列表按位置切片,类似于numpy/Python:

    In [34]: df.iloc[[1, 2, 4], [0, 2]]
    Out[34]: 
                       A         C
    2013-01-02  1.212112  0.119209
    2013-01-03 -0.861849 -0.494929
    2013-01-05 -0.424972  0.276232
    
    
  4. 整行切片:

    In [35]: df.iloc[1:3, :]
    Out[35]: 
                       A         B         C         D
    2013-01-02  1.212112 -0.173215  0.119209 -1.044236
    2013-01-03 -0.861849 -2.104569 -0.494929  1.071804
    
    
  5. 整列切片:

    In [36]: df.iloc[:, 1:3]
    Out[36]: 
                       B         C
    2013-01-01 -0.282863 -1.509059
    2013-01-02 -0.173215  0.119209
    2013-01-03 -2.104569 -0.494929
    2013-01-04 -0.706771 -1.039575
    2013-01-05  0.567020  0.276232
    2013-01-06  0.113648 -1.478427
    
    
  6. 获取具体值:

    In [37]: df.iloc[1, 1]
    Out[37]: -0.17321464905330858
       
    
    
2.3.4 布尔索引
  1. 使用单个列的值来选择数据:

    In [39]: df[df.A > 0]
    Out[39]: 
                       A         B         C         D
    2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
    2013-01-02  1.212112 -0.173215  0.119209 -1.044236
    2013-01-04  0.721555 -0.706771 -1.039575  0.271860
    
    
  2. 从满足布尔条件的DataFrame中选择值:

    In [40]: df[df > 0]
    Out[40]: 
                       A         B         C         D
    2013-01-01  0.469112       NaN       NaN       NaN
    2013-01-02  1.212112       NaN  0.119209       NaN
    2013-01-03       NaN       NaN       NaN  1.071804
    2013-01-04  0.721555       NaN       NaN  0.271860
    2013-01-05       NaN  0.567020  0.276232       NaN
    2013-01-06       NaN  0.113648       NaN  0.524988
    
    
  3. 使用 isin() 方法过滤:

    In [41]: df2 = df.copy()
    
    In [42]: df2['E'] = ['one', 'one', 'two', 'three', 'four', 'three']
    
    In [43]: df2
    Out[43]: 
                       A         B         C         D      E
    2013-01-01  0.469112 -0.282863 -1.509059 -1.135632    one
    2013-01-02  1.212112 -0.173215  0.119209 -1.044236    one
    2013-01-03 -0.861849 -2.104569 -0.494929  1.071804    two
    2013-01-04  0.721555 -0.706771 -1.039575  0.271860  three
    2013-01-05 -0.424972  0.567020  0.276232 -1.087401   four
    2013-01-06 -0.673690  0.113648 -1.478427  0.524988  three
    
    In [44]: df2[df2['E'].isin(['two', 'four'])]
    Out[44]: 
                       A         B         C         D     E
    2013-01-03 -0.861849 -2.104569 -0.494929  1.071804   two
    2013-01-05 -0.424972  0.567020  0.276232 -1.087401  four
    
    
2.4.5 赋值
  1. 添加新列将自动根据索引对齐数据:

    In [45]: s1 = pd.Series([1, 2, 3, 4, 5, 6], index=pd.date_range('20130102', periods=6))
    
    In [46]: s1
    Out[46]: 
    2013-01-02    1
    2013-01-03    2
    2013-01-04    3
    2013-01-05    4
    2013-01-06    5
    2013-01-07    6
    Freq: D, dtype: int64
    
    In [47]: df['F'] = s1
    
    
  2. 通过标签赋值:

    In [48]: df.at[dates[0], 'A'] = 0
    
    
  3. 通过位置赋值:

    In [49]: df.iat[0, 1] = 0
    
    
  4. 使用NumPy数组赋值:

    In [50]: df.loc[:, 'D'] = np.array([5] * len(df))
    
    
  5. 带有where条件的赋值操作:

    In [52]: df2 = df.copy()
    
    In [53]: df2[df2 > 0] = -df2
    
    In [54]: df2
    Out[54]: 
                       A         B         C  D    F
    2013-01-01  0.000000  0.000000 -1.509059 -5  NaN
    2013-01-02 -1.212112 -0.173215 -0.119209 -5 -1.0
    2013-01-03 -0.861849 -2.104569 -0.494929 -5 -2.0
    2013-01-04 -0.721555 -0.706771 -1.039575 -5 -3.0
    2013-01-05 -0.424972 -0.567020 -0.276232 -5 -4.0
    2013-01-06 -0.673690 -0.113648 -1.478427 -5 -5.0
    
    

2.4 缺失值

Pandas主要使用值np.nan来表示缺失的数据。 默认情况下,它不包含在计算中。

  1. 重建索引允许你更改/添加/删除指定轴上的索引。 这个操作会返回一个副本(不会更改原来的对象)。

    In [55]: df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E'])
    
    In [56]: df1.loc[dates[0]:dates[1], 'E'] = 1
    
    In [57]: df1
    Out[57]: 
                       A         B         C  D    F    E
    2013-01-01  0.000000  0.000000 -1.509059  5  NaN  1.0
    2013-01-02  1.212112 -0.173215  0.119209  5  1.0  1.0
    2013-01-03 -0.861849 -2.104569 -0.494929  5  2.0  NaN
    2013-01-04  0.721555 -0.706771 -1.039575  5  3.0  NaN
    
    
  2. 删除任何带有缺失值的行:

    In [58]: df1.dropna(how='any')
    Out[58]: 
                       A         B         C  D    F    E
    2013-01-02  1.212112 -0.173215  0.119209  5  1.0  1.0
    
    
  3. 填充缺失值:

    In [59]: df1.fillna(value=5)
    Out[59]: 
                       A         
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值