pandas是基于numpy的数据处理包,是python界的巨无霸,其手册超过2000页,参见下图,大家感受一下:

其中的getting started部分也有接近200页,即使“10 Minutes to pandas”也有近30页的篇幅!不过,pandas的这个巨无霸手册组织的比较条理,几乎能够解决你的一切问题,应该作为案头的必备工具之一。
建议至少将getting started部分能够通读一遍,了解pandas的强大数据分析方法,重要的功能动手练习一下。下面的内容是本人的练习和其中的一些感悟,不作为系统的教程。pandas如此强大,因此本人也会不断的阅读、练习以加深对pandas的理解,这里也就会有不断的更新。
pandas的数据结构及其创建
如果把numpy比作列表,那么pandas就是字典。pandas的两个主要数据结构是Series和DataFrame,Series由索引和数据两部分组成,DataFrame是由多个Series组成的,本质上是一张二维表格。
Series
import numpy as np
import pandas as pd
data = [1,2,3,np.nan,55]
serial = pd.Series(data)
print(serial)
0     1.0
1     2.0
2     3.0
3     NaN
4    55.0
dtype: float64
可见,如果没有为Series指定索引,pandas会自动创建从0开始的整数索引。下面为Series指定索引:
dates = pd.date_range('20190501', periods=5)
s = pd.Series(data, dates) # 注意参数的顺序,或者这样调用:pd.Series(data=data, index=dates)
print(s)
print(s.index)
print(s.values)
2019-05-01     1.0
2019-05-02     2.0
2019-05-03     3.0
2019-05-04     NaN
2019-05-05    55.0
Freq: D, dtype: float64
DatetimeIndex(['2019-05-01', '2019-05-02', '2019-05-03', '2019-05-04',
               '2019-05-05'],
              dtype='datetime64[ns]', freq='D')
[ 1.  2.  3. nan 55.]
Series的属性具体参见Pandas API reference中的Series部分。
DataFrame
DataFrame中的index是指行的索引,column是列的索引。
直接借用上面创建的dates作为DateFrame的索引,创建一个DataFrame:
df = pd.DataFrame(index=dates, data=np.random.randn(20).reshape((5,4)), columns=list('ABCD'))
df
| A | B | C | D | |
|---|---|---|---|---|
| 2019-05-01 | -1.624347 | -0.528796 | -0.074790 | -1.623435 | 
| 2019-05-02 | -0.869758 | 0.564534 | -1.537493 | 0.158298 | 
| 2019-05-03 | 0.962677 | 0.099774 | -0.804824 | 1.613789 | 
| 2019-05-04 | 0.934002 | 0.806180 | -0.141207 | 2.509175 | 
| 2019-05-05 | -2.036735 | 0.668513 | 0.773942 | 2.131727 | 
查看DataFrame的索引:
df.index
DatetimeIndex(['2019-05-01', '2019-05-02', '2019-05-03', '2019-05-04',
               '2019-05-05'],
              dtype='datetime64[ns]', freq='D')
查看DataFrame的columns:
df.columns
Index(['A', 'B', 'C', 'D'], dtype='object')
查看DataFrames的数据:
df.values
array([[-1.62434694, -0.52879577, -0.07479036, -1.62343509],
       [-0.86975781,  0.56453382, -1.53749287,  0.1582984 ],
       [ 0.96267722,  0.09977408, -0.80482377,  1.61378861],
       [ 0.93400177,  0.80617994, -0.141207  ,  2.50917471],
       [-2.03673517,  0.66851319,  0.77394167,  2.1317268 ]])
DataFrame的数据选取
从DataFrame中选取数据主要有三种方法,分别通过[],loc,iloc属性实现。因此,数据选取的操作都是通过[],注意和函数调用的()区分开来:数据选取不是函数调用。
通过[]选取数据
[]是pandas选取数据的操作符,注意和列表[]区分开来。
df['A']
2019-05-01   -1.624347
2019-05-02   -0.869758
2019-05-03    0.962677
2019-05-04    0.934002
2019-05-05   -2.036735
Freq: D, Name: A, dtype: float64
df[['A','D']] # 注意只是写df['A','D']是不行的,因为外层的[]表示一个选取操作,里层的[]表示选取哪些列的一个列表
| A | D | |
|---|---|---|
| 2019-05-01 | -1.624347 | -1.623435 | 
| 2019-05-02 | -0.869758 | 0.158298 | 
| 2019-05-03 | 0.962677 | 1.613789 | 
| 2019-05-04 | 0.934002 | 2.509175 | 
| 2019-05-05 | -2.036735 | 2.131727 | 
df[0:3]
| A | B | C | D | |
|---|---|---|---|---|
| 2019-05-01 | -1.624347 | -0.528796 | -0.074790 | -1.623435 | 
| 2019-05-02 | -0.869758 | 0.564534 | -1.537493 | 0.158298 | 
| 2019-05-03 | 0.962677 | 0.099774 | -0.804824 | 1.613789 | 
df['20190502':'20190504']
| A | B | C | D | |
|---|---|---|---|---|
| 2019-05-02 | -0.869758 | 0.564534 | -1.537493 | 0.158298 | 
| 2019-05-03 | 0.962677 | 0.099774 | -0.804824 | 1.613789 | 
| 2019-05-04 | 0.934002 | 0.806180 | -0.141207 | 2.509175 | 
通过loc选取数据(给定label)
loc要求给出具体的行或列的label或者其范围选取数据。
df.loc[dates[0]]
A   -1.624347
B   -0.528796
C   -0.074790
D   -1.623435
Name: 2019-05-01 00:00:00, dtype: float64
df.loc[:,['A','C']]
| A | C | |
|---|---|---|
| 2019-05-01 | -1.624347 | -0.074790 | 
| 2019-05-02 | -0.869758 | -1.537493 | 
| 2019-05-03 | 0.962677 | -0.804824 | 
| 2019-05-04 | 0.934002 | -0.141207 | 
| 2019-05-05 | -2.036735 | 0.773942 | 
df.loc['20190501',['A']]
A   -1.624347
Name: 2019-05-01 00:00:00, dtype: float64
df.at[dates[0],'A']
-1.6243469408972495
通过iloc选取数据(给定position)
print(df)
df.iloc[1,1]
                   A         B         C         D
2019-05-01 -1.624347 -0.528796 -0.074790 -1.623435
2019-05-02 -0.869758  0.564534 -1.537493  0.158298
2019-05-03  0.962677  0.099774 -0.804824  1.613789
2019-05-04  0.934002  0.806180 -0.141207  2.509175
2019-05-05 -2.036735  0.668513  0.773942  2.131727
0.564533818704376
df.iloc[3]
A    0.934002
B    0.806180
C   -0.141207
D    2.509175
Name: 2019-05-04 00:00:00, dtype: float64
df.iloc[:,1]
2019-05-01   -0.528796
2019-05-02    0.564534
2019-05-03    0.099774
2019-05-04    0.806180
2019-05-05    0.668513
Freq: D, Name: B, dtype: float64
df.iloc[:,1:3]
| B | C | |
|---|---|---|
| 2019-05-01 | -0.528796 | -0.074790 | 
| 2019-05-02 | 0.564534 | -1.537493 | 
| 2019-05-03 | 0.099774 | -0.804824 | 
| 2019-05-04 | 0.806180 | -0.141207 | 
| 2019-05-05 | 0.668513 | 0.773942 | 
df.iat[0,0]
-1.6243469408972495
关于索引的操作
返回Series中最大/最小数据的column名称
s = df.loc[dates[0]]
s.idxmax()
'C'
s.idxmin()
'A'
返回Series中最大/最小数据的column位置
这里注意,直接调用Series.argmax等同于idxmax且已经depricated。
print(s)
print(s.values.argmax())
A   -1.624347
B   -0.528796
C   -0.074790
D   -1.623435
Name: 2019-05-01 00:00:00, dtype: float64
2
s.values.argmin()
0
DataFrame上的逻辑操作
可以在整个或者部分DataFrame执行all或者any逻辑操作。
(df == 0).all()
A    False
B    False
C    False
D    False
dtype: bool
(df.iloc[0,:] > 0).all()
False
