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

pandas manual

其中的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