Pandas 学习笔记
Pandas
第一章 概述
1.1 简单概述
Pandas 是一个python的包,提供快速、灵活和富有表现力的数据结构,旨在使“关系”或“标记”数据的使用既简单又直观。
Pandas 非常适合许多不同类型的数据:
- 具有异构类型列的表格数据,如SQL表或Excel电子表格
- 有序和无序(不一定是固定频率)时间序列数据
- 具有行和列表前的任意矩形数据(均匀类型或异构)
- 任何其他形式的观察/统计数据集,实际上不需要将数据标记为放置在Pandas数据结构中
1.2 适用pandas的任务
- 在浮点和非浮点数据中轻松处理缺失数据(表示为Nan)
- 大小可变性:可以从DataFrame和更高维度的对象中插入和删除
- 自动和显式数据对齐:对象可以明确地与一组标签对齐,或者用户可以简单地忽略标签,让Series,Dataframe等在计算中自动对齐数据
- 强大、灵活的组(group by)功能,可对数据集执行拆分应用组合操作,用于聚合和转换数据
- 轻松将其他Python和Numpy数据结构中的不规则,不同索引数据转换为dataframe对象
- 基于智能标签的切片、花式索引和子集大数据集
- 直观合并和加入数据集
- 灵活的重塑和数据集的旋转
- 轴的分层标记(每个刻度可能有多个标签)
- 强大的io工具,用于从平面文件(csv和分隔)、Excel文件、数据库以及能从超快的HDFS格式中保存或加载数据
- 特定时间序列功能:日期范围生成和频率转换、移动窗口统计、移动窗口线性回归、日期转换和滞后
1.3 数据结构
维数 | 名称 | 描述 |
---|---|---|
1 | Series | 可以看作标签(默认是整数序列RangeIndex;可以重复)的一维数组(同类型),是scalars的结合,同时也是dataframe的元素 |
2 | DataFrame | 一般是二维标签,尺寸可变的表格结构,具有潜在的异质型列 |
第二种 Pandas入门
2.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
通过传递带有日期时间索引和带有标签列的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
通过传递可以转换为类似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
Dataframe 的列具有不同的数据类型
In [11]: df2.dtypes Out[11]: A float64 B datetime64[ns] C float32 D int32 E category F object dtype: object
2.2 查看数据
查看头部和尾部数据
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
显示索引、列、和底层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')
转置数据
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
按轴排序
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
按值排序
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 获取
选择一个列,产生一个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
通过[],对数据进行切片
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 按标签选择
通过标签获取一行数据
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
通过标签在多个轴上选择数据
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
通过标签同时在两个轴上切片
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 按位置选择
通过传递的整数的位置选择
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
通过整数切片,类似于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
通过传递整数的列表按位置切片,类似于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
整行切片:
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
整列切片:
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
获取具体值:
In [37]: df.iloc[1, 1] Out[37]: -0.17321464905330858
2.3.4 布尔索引
使用单个列的值来选择数据:
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
从满足布尔条件的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
使用 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 赋值
添加新列将自动根据索引对齐数据:
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
通过标签赋值:
In [48]: df.at[dates[0], 'A'] = 0
通过位置赋值:
In [49]: df.iat[0, 1] = 0
使用NumPy数组赋值:
In [50]: df.loc[:, 'D'] = np.array([5] * len(df))
带有
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来表示缺失的数据。 默认情况下,它不包含在计算中。
重建索引允许你更改/添加/删除指定轴上的索引。 这个操作会返回一个副本(不会更改原来的对象)。
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
删除任何带有缺失值的行:
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
填充缺失值:
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
获取值为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 统计
在一些操作中经常会排除缺失值。
In [61]: df.mean() Out[61]: A -0.004474 B -0.383981 C -0.687758 D 5.000000 F 3.000000 dtype: float64
在其它轴(行)上进行同样的操作:
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
使用具有不同维度且需要对齐的对象进行操作。 此外,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)
将函数应用于数据:
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
In [145]: df.to_hdf('foo.h5', 'df')
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 学习笔记相关推荐
- pandas学习笔记:pandas.Dataframe.rename()函数用法
pandas学习笔记:pandas.Dataframe.rename()函数用法 pandas.Dataframe.rename()函数主要是用来修改Dataframe数据的行名和列名. 主要用到的参 ...
- Pandas学习笔记(一)
Pandas学习笔记一 Pandas数组读取 读取csv.tsv.txt文件 读取excel文件 读取mysql数据表 Pandas数据结构 创建Series的几种方法 根据标签查询Series数据 ...
- pandas学习笔记之DateFrame
pandas学习笔记之DateFrame 文章目录 pandas学习笔记之DateFrame 1.DateFrame的创建 1)认识DataFrame对象 2)由二维列表创建(默认index和colu ...
- 数据分析之pandas学习笔记(六)(层次化索引、重塑、轴向旋转、行列变换、合并表数据)
数据分析之Pandas学习笔记(六)(层次化索引.重塑.轴向旋转.行列变换.合并表数据) level层次化索引 unstack()与stack()进行重塑,即:行列索引变换 swaplevel()交换 ...
- [Pandas 学习笔记] - No.1 pandas学习笔记
pandas学习笔记 pandas是基于numpy开发出的数据分析包,用于高效地操作大型数据集.pandas的数据结构有三种 分别为 series,dataframe和panel,对应一维,二维,三维 ...
- pandas学习笔记之Series
pandas学习笔记之Series 文章目录 pandas学习笔记之Series pandas中Series的创建 1)用python中的列表list创建: 2)用numpy数组创建 3)用pytho ...
- pandas学习笔记(三):数据的变换与数据的管理
注:学习笔记基于文彤老师的pandas的系列课程 课程链接:https://study.163.com/course/courseMain.htm?courseId=1005124008&sh ...
- Pandas 学习笔记一
文章目录 Pandas 学习 核心数据结构 DataFrame 属性 Panel Series 基本数据操作 运算 Pandas 学习 核心数据结构 DataFrame import numpy as ...
- pandas 每一列相加_Python3 numpy amp; pandas 学习笔记
写在前面 在用python做一些ML和DL的工作前,先看莫烦大佬的视频学习一下numpy和pandas这两个数据处理包,学习中记了一些笔记,便于自己日后查阅,同时发布到知乎希望能够帮助到其他小伙伴! ...
- Python科学计算-Numpy和Pandas学习笔记(一)-安装、Numpy属性和常用方法(chaochao`s Blog)
1 前言 由于项目的原因,最近开始学习机器学习的相关内容,在写文字笔记的时候发现我写的字确实很丑.很难看,并且记笔记的速度也很慢,由此萌生了编写自己博客的想法.从今天开始,我会将学习的笔记以博客的方式 ...
最新文章
- LintCode: Edit Distance
- 令人机双双崩溃的VS2008 SP1!WPF用户请勿更新!
- 038_JDK的Iterable接口
- 2.4 程序示例--线性决策边界-机器学习笔记-斯坦福吴恩达教授
- 计算机网络及公文写作知识,计算机网络期末复习题
- 计算机管理与维护实践课程,天津2012年自考“计算机维护维修(实践)”课程考试大纲...
- 數據庫ORACLE轉MYSQL存儲過程遇到的坑~(總結)
- hadoop ubantu环境搭建_ubuntu hadoop学习 环境搭建
- XFire WebService开发快速起步
- java数组写99乘法表,Java 实现乘法口诀(99乘法表)
- nginx学习笔记002---Nginx代理配置_案例1_实现了对前端代码的方向代理_并且配置了后端api接口的访问地址
- 【msdn wpf forum翻译】获取当前窗口焦点所在的元素
- 1.4.1bat脚本命令COPY 拷贝 复制到
- HCIE-OSPFV3
- 汇编语言跳转指令总结
- GMQ钱包积极打造并维护区块链健康生态的发展
- Options error: In [CMD-LINE]:1: Error opening configuration file: xxxx.ovpn
- omf多路径 oracle_ORACLE OMF
- 学习笔记:Oracle函数大全
- 计算机网络技术毕业生实习报告_计算机网络技术实习报告范文
热门文章
- python在冒号处显示语法错误_深入解析Python小白学习【操作列表】
- 先进半导体材料与器件Chapter1
- 乐观锁和悲观锁的区别
- 2020年低压电工证模拟考试题库及低压电工理论考试试题
- 开源游戏区块链项目分享:Unity开发的独立区块链
- T.R 武林三国外挂
- matlab中无穷小的数如何,2018考研数学:怎么确定函数的无穷小阶数
- Go之XORM操作MySQL
- 灵境(元宇宙)深度解读 李正海
- 压力表负值表示什么_弹簧管式压力表轻敲变动量居然有负值,我不知道是不是我学的不好,还是计量所所长脑子有病...