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.087401In [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.071804In [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  threeIn [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: int64In [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] = -df2In [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'] = 1In [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         B         C  D    F    E
    2013-01-01  0.000000  0.000000 -1.509059  5  5.0  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  5.0
    2013-01-04  0.721555 -0.706771 -1.039575  5  3.0  5.0
  4. 获取值为nan的掩码:

    In [60]: pd.isna(df1)
    Out[60]: A      B      C      D      F      E
    2013-01-01  False  False  False  False   True  False
    2013-01-02  False  False  False  False  False  False
    2013-01-03  False  False  False  False  False   True
    2013-01-04  False  False  False  False  False   True

2.5 Pandas 操作

2.5.1 统计

  1. 在一些操作中经常会排除缺失值。

    In [61]: df.mean()
    Out[61]:
    A   -0.004474
    B   -0.383981
    C   -0.687758
    D    5.000000
    F    3.000000
    dtype: float64
  2. 在其它轴(行)上进行同样的操作:

    In [62]: df.mean(1)
    Out[62]:
    2013-01-01    0.872735
    2013-01-02    1.431621
    2013-01-03    0.707731
    2013-01-04    1.395042
    2013-01-05    1.883656
    2013-01-06    1.592306
    Freq: D, dtype: float64
  3. 使用具有不同维度且需要对齐的对象进行操作。 此外,Pandas会自动沿指定维度进行广播。

    In [63]: s = pd.Series([1, 3, 5, np.nan, 6, 8], index=dates).shift(2)In [64]: s
    Out[64]:
    2013-01-01    NaN
    2013-01-02    NaN
    2013-01-03    1.0
    2013-01-04    3.0
    2013-01-05    5.0
    2013-01-06    NaN
    Freq: D, dtype: float64In [65]: df.sub(s, axis='index')
    Out[65]: A         B         C    D    F
    2013-01-01       NaN       NaN       NaN  NaN  NaN
    2013-01-02       NaN       NaN       NaN  NaN  NaN
    2013-01-03 -1.861849 -3.104569 -1.494929  4.0  1.0
    2013-01-04 -2.278445 -3.706771 -4.039575  2.0  0.0
    2013-01-05 -5.424972 -4.432980 -4.723768  0.0 -1.0
    2013-01-06       NaN       NaN       NaN  NaN  NaN

2.5.2 应用(Apply)

  1. 将函数应用于数据:

    In [66]: df.apply(np.cumsum)
    Out[66]: A         B         C   D     F
    2013-01-01  0.000000  0.000000 -1.509059   5   NaN
    2013-01-02  1.212112 -0.173215 -1.389850  10   1.0
    2013-01-03  0.350263 -2.277784 -1.884779  15   3.0
    2013-01-04  1.071818 -2.984555 -2.924354  20   6.0
    2013-01-05  0.646846 -2.417535 -2.648122  25  10.0
    2013-01-06 -0.026844 -2.303886 -4.126549  30  15.0In [67]: df.apply(lambda x: x.max() - x.min())
    Out[67]:
    A    2.073961
    B    2.671590
    C    1.785291
    D    0.000000
    F    4.000000
    dtype: float642

2.5.3 字符串方法

Series在str属性中配备了一组字符串处理方法,可以轻松地对数组的每个元素进行操作,如下面的代码片段所示。 请注意,str中的模式匹配中默认情况下通常使用正则表达式。 请参阅Vectorized String Methods。

In [71]: s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat'])In [72]: s.str.lower()
Out[72]:
0       a
1       b
2       c
3    aaba
4    baca
5     NaN
6    caba
7     dog
8     cat
dtype: object

2.6 合并(Merge)

2.6.1 连接(Concat)

使用 concat()连接Pandas对象:

In [73]: df = pd.DataFrame(np.random.randn(10, 4))In [74]: df
Out[74]: 0         1         2         3
0 -0.548702  1.467327 -1.015962 -0.483075
1  1.637550 -1.217659 -0.291519 -1.745505
2 -0.263952  0.991460 -0.919069  0.266046
3 -0.709661  1.669052  1.037882 -1.705775
4 -0.919854 -0.042379  1.247642 -0.009920
5  0.290213  0.495767  0.362949  1.548106
6 -1.131345 -0.089329  0.337863 -0.945867
7 -0.932132  1.956030  0.017587 -0.016692
8 -0.575247  0.254161 -1.143704  0.215897
9  1.193555 -0.077118 -0.408530 -0.862495# break it into pieces
In [75]: pieces = [df[:3], df[3:7], df[7:]]In [76]: pd.concat(pieces)
Out[76]: 0         1         2         3
0 -0.548702  1.467327 -1.015962 -0.483075
1  1.637550 -1.217659 -0.291519 -1.745505
2 -0.263952  0.991460 -0.919069  0.266046
3 -0.709661  1.669052  1.037882 -1.705775
4 -0.919854 -0.042379  1.247642 -0.009920
5  0.290213  0.495767  0.362949  1.548106
6 -1.131345 -0.089329  0.337863 -0.945867
7 -0.932132  1.956030  0.017587 -0.016692
8 -0.575247  0.254161 -1.143704  0.215897
9  1.193555 -0.077118 -0.408530 -0.862495

2.6.2 Join

SQL风格的合并。 请参阅数据库风格连接部分。

In [77]: left = pd.DataFrame({'key': ['foo', 'foo'], 'lval': [1, 2]})In [78]: right = pd.DataFrame({'key': ['foo', 'foo'], 'rval': [4, 5]})In [79]: left
Out[79]: key  lval
0  foo     1
1  foo     2In [80]: right
Out[80]: key  rval
0  foo     4
1  foo     5In [81]: pd.merge(left, right, on='key')
Out[81]: key  lval  rval
0  foo     1     4
1  foo     1     5
2  foo     2     4
3  foo     2     5

另一个例子是:

In [82]: left = pd.DataFrame({'key': ['foo', 'bar'], 'lval': [1, 2]})In [83]: right = pd.DataFrame({'key': ['foo', 'bar'], 'rval': [4, 5]})In [84]: left
Out[84]: key  lval
0  foo     1
1  bar     2In [85]: right
Out[85]: key  rval
0  foo     4
1  bar     5In [86]: pd.merge(left, right, on='key')
Out[86]: key  lval  rval
0  foo     1     4
1  bar     2     5

2.6.3 追加(Append)

给dataframe追加一行。 请参阅 Appending 部分。

In [87]: df = pd.DataFrame(np.random.randn(8, 4), columns=['A', 'B', 'C', 'D'])In [88]: df
Out[88]: A         B         C         D
0  1.346061  1.511763  1.627081 -0.990582
1 -0.441652  1.211526  0.268520  0.024580
2 -1.577585  0.396823 -0.105381 -0.532532
3  1.453749  1.208843 -0.080952 -0.264610
4 -0.727965 -0.589346  0.339969 -0.693205
5 -0.339355  0.593616  0.884345  1.591431
6  0.141809  0.220390  0.435589  0.192451
7 -0.096701  0.803351  1.715071 -0.708758In [89]: s = df.iloc[3]In [90]: df.append(s, ignore_index=True)
Out[90]: A         B         C         D
0  1.346061  1.511763  1.627081 -0.990582
1 -0.441652  1.211526  0.268520  0.024580
2 -1.577585  0.396823 -0.105381 -0.532532
3  1.453749  1.208843 -0.080952 -0.264610
4 -0.727965 -0.589346  0.339969 -0.693205
5 -0.339355  0.593616  0.884345  1.591431
6  0.141809  0.220390  0.435589  0.192451
7 -0.096701  0.803351  1.715071 -0.708758
8  1.453749  1.208843 -0.080952 -0.264610

2.7 分组(Groupin)qub

我们所说的“group by“是指涉及下列一项或多项步骤的程序:

  • 分割:根据一些标准将数据分解成组
  • 应用:将函数独立地应用于每个组
  • 组合:将结果组合成数据结构

请参阅 Grouping 部分。

In [91]: df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar',....:                          'foo', 'bar', 'foo', 'foo'],....:                    'B': ['one', 'one', 'two', 'three',....:                          'two', 'two', 'one', 'three'],....:                    'C': np.random.randn(8),....:                    'D': np.random.randn(8)})....: In [92]: df
Out[92]: A      B         C         D
0  foo    one -1.202872 -0.055224
1  bar    one -1.814470  2.395985
2  foo    two  1.018601  1.552825
3  bar  three -0.595447  0.166599
4  foo    two  1.395433  0.047609
5  bar    two -0.392670 -0.136473
6  foo    one  0.007207 -0.561757
7  foo  three  1.928123 -1.623033

分组,然后将sum()函数应用于分组结果:

In [93]: df.groupby('A').sum()
Out[93]: C        D
A
bar -2.802588  2.42611
foo  3.146492 -0.63958

按多列分组形成层次索引,同样,我们可以应用sum函数:

In [94]: df.groupby(['A', 'B']).sum()
Out[94]: C         D
A   B
bar one   -1.814470  2.395985three -0.595447  0.166599two   -0.392670 -0.136473
foo one   -1.195665 -0.616981three  1.928123 -1.623033two    2.414034  1.600434

2.8 重塑(Reshaping)

堆叠(Stack)

In [95]: tuples = list(zip(*[['bar', 'bar', 'baz', 'baz',....:                      'foo', 'foo', 'qux', 'qux'],....:                     ['one', 'two', 'one', 'two',....:                      'one', 'two', 'one', 'two']]))....: In [96]: index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])In [97]: df = pd.DataFrame(np.random.randn(8, 2), index=index, columns=['A', 'B'])In [98]: df2 = df[:4]In [99]: df2
Out[99]: A         B
first second
bar   one     0.029399 -0.542108two     0.282696 -0.087302
baz   one    -1.575170  1.771208two     0.816482  1.100230

stack()方法压缩DataFrame的列:

In [100]: stacked = df2.stack()In [101]: stacked
Out[101]:
first  second   B   -0.542108two     A    0.282696B   -0.087302
baz    one     A   -1.575170B    1.771208two     A    0.816482B    1.100230
dtype: float64

“压缩”后的DataFrame或Series(具有MultiIndex作为索引), stack() 的逆操作是unstack(),默认情况下取消最后压缩的那个级别:

In [102]: stacked.unstack()
Out[102]: A         B
first second
bar   one     0.029399 -0.542108two     0.282696 -0.087302
baz   one    -1.575170  1.771208two     0.816482  1.100230In [103]: stacked.unstack(1)
Out[103]:
second        one       two
first
bar   A  0.029399  0.282696B -0.542108 -0.087302
baz   A -1.575170  0.816482B  1.771208  1.100230In [104]: stacked.unstack(0)
Out[104]:
first          bar       baz
second
one    A  0.029399 -1.575170B -0.542108  1.771208
two    A  0.282696  0.816482B -0.087302  1.100230

2.9 时间序列

andas具有简单,强大且高效的功能,用于在频率转换期间执行重采样操作(例如,将第二数据转换为5分钟数据)。 这在财务应用程序中非常常见,但不仅限于此。请参阅时间序列部分部分。

In [108]: rng = pd.date_range('1/1/2012', periods=100, freq='S')In [109]: ts = pd.Series(np.random.randint(0, 500, len(rng)), index=rng)In [110]: ts.resample('5Min').sum()
Out[110]:
2012-01-01    25083
Freq: 5T, dtype: int64

时区代表:

In [111]: rng = pd.date_range('3/6/2012 00:00', periods=5, freq='D')In [112]: ts = pd.Series(np.random.randn(len(rng)), rng)In [113]: ts
Out[113]:
2012-03-06    0.464000
2012-03-07    0.227371
2012-03-08   -0.496922
2012-03-09    0.306389
2012-03-10   -2.290613
Freq: D, dtype: float64In [114]: ts_utc = ts.tz_localize('UTC')In [115]: ts_utc
Out[115]:
2012-03-06 00:00:00+00:00    0.464000
2012-03-07 00:00:00+00:00    0.227371
2012-03-08 00:00:00+00:00   -0.496922
2012-03-09 00:00:00+00:00    0.306389
2012-03-10 00:00:00+00:00   -2.290613
Freq: D, dtype: float64

转换为另一个时区:

In [116]: ts_utc.tz_convert('US/Eastern')
Out[116]:
2012-03-05 19:00:00-05:00    0.464000
2012-03-06 19:00:00-05:00    0.227371
2012-03-07 19:00:00-05:00   -0.496922
2012-03-08 19:00:00-05:00    0.306389
2012-03-09 19:00:00-05:00   -2.290613
Freq: D, dtype: float64

在时间跨度表示之间转换:

In [117]: rng = pd.date_range('1/1/2012', periods=5, freq='M')In [118]: ts = pd.Series(np.random.randn(len(rng)), index=rng)In [119]: ts
Out[119]:
2012-01-31   -1.134623
2012-02-29   -1.561819
2012-03-31   -0.260838
2012-04-30    0.281957
2012-05-31    1.523962
Freq: M, dtype: float64In [120]: ps = ts.to_period()In [121]: ps
Out[121]:
2012-01   -1.134623
2012-02   -1.561819
2012-03   -0.260838
2012-04    0.281957
2012-05    1.523962
Freq: M, dtype: float64In [122]: ps.to_timestamp()
Out[122]:
2012-01-01   -1.134623
2012-02-01   -1.561819
2012-03-01   -0.260838
2012-04-01    0.281957
2012-05-01    1.523962
Freq: MS, dtype: float64

周期和时间戳之间的转换可以使用一些方便的算术函数。在下面的例子中,我们将一个以11月为结束年份的季度频率转换为季度结束后一个月末的上午9点:

In [123]: prng = pd.period_range('1990Q1', '2000Q4', freq='Q-NOV')In [124]: ts = pd.Series(np.random.randn(len(prng)), prng)In [125]: ts.index = (prng.asfreq('M', 'e') + 1).asfreq('H', 's') + 9In [126]: ts.head()
Out[126]:
1990-03-01 09:00   -0.902937
1990-06-01 09:00    0.068159
1990-09-01 09:00   -0.057873
1990-12-01 09:00   -0.368204
1991-03-01 09:00   -1.144073
Freq: H, dtype: float64

2.10 绘图

In [135]: ts = pd.Series(np.random.randn(1000),.....:                index=pd.date_range('1/1/2000', periods=1000)).....: In [136]: ts = ts.cumsum()In [137]: ts.plot()
Out[137]: <matplotlib.axes._subplots.AxesSubplot at 0x7f2b5771ac88>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lYeoeUPz-1572420174284)(https://www.pypandas.cn/static/images/series_plot_basic.png)]

在一个DataFrame中, plot() 方法可以方便地绘制带有label的所有列:

In [138]: df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index,.....:                   columns=['A', 'B', 'C', 'D']).....: In [139]: df = df.cumsum()In [140]: plt.figure()
Out[140]: <Figure size 640x480 with 0 Axes>In [141]: df.plot()
Out[141]: <matplotlib.axes._subplots.AxesSubplot at 0x7f2b53a2d7f0>In [142]: plt.legend(loc='best')
Out[142]: <matplotlib.legend.Legend at 0x7f2b539728d0>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mq4VEHux-1572420174285)(https://www.pypandas.cn/static/images/frame_plot_basic.png)]

2.11 数据的输入输出

写入CSV文件。

In [143]: df.to_csv('foo.csv')

从CSV文件读数据:

In [144]: pd.read_csv('foo.csv')
Out[144]: 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]

#HDF5

请参阅HDFStores。

写入HDF5:

In [145]: df.to_hdf('foo.h5', 'df')

从HDF5读数据:

In [146]: pd.read_hdf('foo.h5', 'df')
Out[146]: A          B         C          D
2000-01-01   0.266457  -0.399641 -0.219582   1.186860
2000-01-02  -1.170732  -0.345873  1.653061  -0.282953
2000-01-03  -1.734933   0.530468  2.060811  -0.515536
2000-01-04  -1.555121   1.452620  0.239859  -1.156896
2000-01-05   0.578117   0.511371  0.103552  -2.428202
2000-01-06   0.478344   0.449933 -0.741620  -1.962409
2000-01-07   1.235339  -0.091757 -1.543861  -1.084753
...               ...        ...       ...        ...
2002-09-20 -10.628548  -9.153563 -7.883146  28.313940
2002-09-21 -10.390377  -8.727491 -6.399645  30.914107
2002-09-22  -8.985362  -8.485624 -4.669462  31.367740
2002-09-23  -9.558560  -8.781216 -4.499815  30.518439
2002-09-24  -9.902058  -9.340490 -4.386639  30.105593
2002-09-25 -10.216020  -9.480682 -3.933802  29.758560
2002-09-26 -11.856774 -10.671012 -3.216025  29.369368[1000 rows x 4 columns]

Pandas 学习笔记相关推荐

  1. pandas学习笔记:pandas.Dataframe.rename()函数用法

    pandas学习笔记:pandas.Dataframe.rename()函数用法 pandas.Dataframe.rename()函数主要是用来修改Dataframe数据的行名和列名. 主要用到的参 ...

  2. Pandas学习笔记(一)

    Pandas学习笔记一 Pandas数组读取 读取csv.tsv.txt文件 读取excel文件 读取mysql数据表 Pandas数据结构 创建Series的几种方法 根据标签查询Series数据 ...

  3. pandas学习笔记之DateFrame

    pandas学习笔记之DateFrame 文章目录 pandas学习笔记之DateFrame 1.DateFrame的创建 1)认识DataFrame对象 2)由二维列表创建(默认index和colu ...

  4. 数据分析之pandas学习笔记(六)(层次化索引、重塑、轴向旋转、行列变换、合并表数据)

    数据分析之Pandas学习笔记(六)(层次化索引.重塑.轴向旋转.行列变换.合并表数据) level层次化索引 unstack()与stack()进行重塑,即:行列索引变换 swaplevel()交换 ...

  5. [Pandas 学习笔记] - No.1 pandas学习笔记

    pandas学习笔记 pandas是基于numpy开发出的数据分析包,用于高效地操作大型数据集.pandas的数据结构有三种 分别为 series,dataframe和panel,对应一维,二维,三维 ...

  6. pandas学习笔记之Series

    pandas学习笔记之Series 文章目录 pandas学习笔记之Series pandas中Series的创建 1)用python中的列表list创建: 2)用numpy数组创建 3)用pytho ...

  7. pandas学习笔记(三):数据的变换与数据的管理

    注:学习笔记基于文彤老师的pandas的系列课程 课程链接:https://study.163.com/course/courseMain.htm?courseId=1005124008&sh ...

  8. Pandas 学习笔记一

    文章目录 Pandas 学习 核心数据结构 DataFrame 属性 Panel Series 基本数据操作 运算 Pandas 学习 核心数据结构 DataFrame import numpy as ...

  9. pandas 每一列相加_Python3 numpy amp; pandas 学习笔记

    写在前面 在用python做一些ML和DL的工作前,先看莫烦大佬的视频学习一下numpy和pandas这两个数据处理包,学习中记了一些笔记,便于自己日后查阅,同时发布到知乎希望能够帮助到其他小伙伴! ...

  10. Python科学计算-Numpy和Pandas学习笔记(一)-安装、Numpy属性和常用方法(chaochao`s Blog)

    1 前言 由于项目的原因,最近开始学习机器学习的相关内容,在写文字笔记的时候发现我写的字确实很丑.很难看,并且记笔记的速度也很慢,由此萌生了编写自己博客的想法.从今天开始,我会将学习的笔记以博客的方式 ...

最新文章

  1. LintCode: Edit Distance
  2. 令人机双双崩溃的VS2008 SP1!WPF用户请勿更新!
  3. 038_JDK的Iterable接口
  4. 2.4 程序示例--线性决策边界-机器学习笔记-斯坦福吴恩达教授
  5. 计算机网络及公文写作知识,计算机网络期末复习题
  6. 计算机管理与维护实践课程,天津2012年自考“计算机维护维修(实践)”课程考试大纲...
  7. 數據庫ORACLE轉MYSQL存儲過程遇到的坑~(總結)
  8. hadoop ubantu环境搭建_ubuntu hadoop学习 环境搭建
  9. XFire WebService开发快速起步
  10. java数组写99乘法表,Java 实现乘法口诀(99乘法表)
  11. nginx学习笔记002---Nginx代理配置_案例1_实现了对前端代码的方向代理_并且配置了后端api接口的访问地址
  12. 【msdn wpf forum翻译】获取当前窗口焦点所在的元素
  13. 1.4.1bat脚本命令COPY 拷贝 复制到
  14. HCIE-OSPFV3
  15. 汇编语言跳转指令总结
  16. GMQ钱包积极打造并维护区块链健康生态的发展
  17. Options error: In [CMD-LINE]:1: Error opening configuration file: xxxx.ovpn
  18. omf多路径 oracle_ORACLE OMF
  19. 学习笔记:Oracle函数大全
  20. 计算机网络技术毕业生实习报告_计算机网络技术实习报告范文

热门文章

  1. python在冒号处显示语法错误_深入解析Python小白学习【操作列表】
  2. 先进半导体材料与器件Chapter1
  3. 乐观锁和悲观锁的区别
  4. 2020年低压电工证模拟考试题库及低压电工理论考试试题
  5. 开源游戏区块链项目分享:Unity开发的独立区块链
  6. T.R 武林三国外挂
  7. matlab中无穷小的数如何,2018考研数学:怎么确定函数的无穷小阶数
  8. Go之XORM操作MySQL
  9. 灵境(元宇宙)深度解读 李正海
  10. 压力表负值表示什么_弹簧管式压力表轻敲变动量居然有负值,我不知道是不是我学的不好,还是计量所所长脑子有病...