今天到了我们学习python的最后一天,今后我会尝试开启Linux或java的学习,大家也可以向我私信大家想看什么。那么废话不多说开始我们今天的学习。
十分钟上手 Pandas
pandas
是一个 Python Data Analysis Library
。
安装请参考官网的教程,如果安装了 Anaconda
,则不需要安装 pandas
库。
In [1]:
%matplotlib inline
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
产生 Pandas 对象
pandas
中有三种基本结构:
Series
- 1D labeled homogeneously-typed array
DataFrame
- General 2D labeled, size-mutable tabular structure with potentially heterogeneously-typed columns
Panel
- General 3D labeled, also size-mutable array
Series
一维 Series
可以用一维列表初始化:
In [2]:
s = pd.Series([1,3,5,np.nan,6,8])
print s
0 1
1 3
2 5
3 NaN
4 6
5 8
dtype: float64
默认情况下,Series
的下标都是数字(可以使用额外参数指定),类型是统一的。
DataFrame
DataFrame
则是个二维结构,这里首先构造一组时间序列,作为我们第一维的下标:
In [3]:
dates = pd.date_range('20130101', periods=6)
print dates
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
'2013-01-05', '2013-01-06'],
dtype='datetime64[ns]', freq='D')
随后我们创建一个DataFrame结构:
In [4]:
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
df
默认情况下,如果不指定 index
参数和 columns
,那么他们的值将用从 0
开始的数字替代。
除了向 DataFrame
中传入二维数组,我们也可以使用字典传入数据:
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' })
df2
得到数据:
我们要使字典的每个 key
代表一列,其 value
可以是各种能够转化为 Series
的对象。
与 Series
要求所有的类型都一致不同,DataFrame
值要求每一列数据的格式相同:
In [6]:
df2.dtypes
Out[6]:
A float64
B datetime64[ns]
C float32
D int32
E category
F object
dtype: object
查看数据
头尾数据
head
和 tail
方法可以分别查看最前面几行和最后面几行的数据(默认为 5):
In [7]:
df.head()
Out[7]:
A | B | C | D | |
---|---|---|---|---|
2013-01-01 | ||||
——- | ||||
-0.605936 | -0.861658 | -1.001924 | 1.528584 | |
2013-01-02 | ||||
——- | ||||
-0.165408 | 0.388338 | 1.187187 | 1.819818 | |
2013-01-03 | ||||
——- | ||||
0.065255 | -1.608074 | -1.282331 | -0.286067 | |
2013-01-04 | ||||
——- | ||||
1.289305 | 0.497115 | -0.225351 | 0.040239 | |
2013-01-05 | ||||
——- | ||||
0.038232 | 0.875057 | -0.092526 | 0.934432 |
到这里也就快结束 了,还有三行,所以冲啊!
In [8]:
df.tail(3)
Out[8]:
A | B | C | D | |
---|---|---|---|---|
2013-01-04 | ||||
——- | ||||
1.289305 | 0.497115 | -0.225351 | 0.040239 | |
2013-01-05 | ||||
——- | ||||
0.038232 | 0.875057 | -0.092526 | 0.934432 | |
2013-01-06 | ||||
——- | ||||
-2.163453 | -0.010279 | 1.699886 | 1.291653 |
下标,列标,数据
下标使用 index
属性查看:
In [9]:
df.index
Out[9]:
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
'2013-01-05', '2013-01-06'],
dtype='datetime64[ns]', freq='D')
列标使用 columns
属性查看:
In [10]:
df.columns
Out[10]:
Index([u'A', u'B', u'C', u'D'], dtype='object')
数据值使用 values
查看:
In [11]:
df.values
Out[11]:
array([[-0.60593585, -0.86165752, -1.00192387, 1.52858443],
[-0.16540784, 0.38833783, 1.18718697, 1.81981793],
[ 0.06525454, -1.60807414, -1.2823306 , -0.28606716],
[ 1.28930486, 0.49711531, -0.22535143, 0.04023897],
[ 0.03823179, 0.87505664, -0.0925258 , 0.93443212],
[-2.16345271, -0.01027865, 1.69988608, 1.29165337]])
统计数据
查看简单的统计数据:
In [12]:
df.describe()
Out[12]:
A | B | C | D | |
---|---|---|---|---|
count | ||||
——- | ||||
6.000000 | 6.000000 | 6.000000 | 6.000000 | |
mean | ||||
——- | ||||
-0.257001 | -0.119917 | 0.047490 | 0.888110 | |
std | ||||
——- | ||||
1.126657 | 0.938705 | 1.182629 | 0.841529 | |
min | ||||
——- | ||||
-2.163453 | -1.608074 | -1.282331 | -0.286067 | |
25% | ||||
——- | ||||
-0.495804 | -0.648813 | -0.807781 | 0.263787 | |
50% | ||||
——- | ||||
-0.063588 | 0.189030 | -0.158939 | 1.113043 | |
75% | ||||
——- | ||||
0.058499 | 0.469921 | 0.867259 | 1.469352 | |
max | ||||
——- | ||||
1.289305 | 0.875057 | 1.699886 | 1.819818 |
转置
In [13]:
df.T
Out[13]:
2013-01-01 00:00:00 | 2013-01-02 00:00:00 | 2013-01-03 00:00:00 | 2013-01-04 00:00:00 | 2013-01-05 00:00:00 | 2013-01-06 00:00:00 | |
---|---|---|---|---|---|---|
A | ||||||
——- | ||||||
-0.605936 | -0.165408 | 0.065255 | 1.289305 | 0.038232 | -2.163453 | |
B | ||||||
——- | ||||||
-0.861658 | 0.388338 | -1.608074 | 0.497115 | 0.875057 | -0.010279 | |
C | ||||||
——- | ||||||
-1.001924 | 1.187187 | -1.282331 | -0.225351 | -0.092526 | 1.699886 | |
D | ||||||
——- | ||||||
1.528584 | 1.819818 | -0.286067 | 0.040239 | 0.934432 | 1.291653 |
排序
sort_index(axis=0, ascending=True)
方法按照下标大小进行排序,axis=0
表示按第 0 维进行排序。
In [14]:
df.sort_index(ascending=False)
Out[14]:
A | B | C | D | |
---|---|---|---|---|
2013-01-06 | ||||
——- | ||||
-2.163453 | -0.010279 | 1.699886 | 1.291653 | |
2013-01-05 | ||||
——- | ||||
0.038232 | 0.875057 | -0.092526 | 0.934432 | |
2013-01-04 | ||||
——- | ||||
1.289305 | 0.497115 | -0.225351 | 0.040239 | |
2013-01-03 | ||||
——- | ||||
0.065255 | -1.608074 | -1.282331 | -0.286067 | |
2013-01-02 | ||||
——- | ||||
-0.165408 | 0.388338 | 1.187187 | 1.819818 | |
2013-01-01 | ||||
——- | ||||
-0.605936 | -0.861658 | -1.001924 | 1.528584 |
In [15]:
df.sort_index(axis=1, ascending=False)
Out[16]:
A | B | C | D | |
---|---|---|---|---|
2013-01-03 | ||||
——- | ||||
0.065255 | -1.608074 | -1.282331 | -0.286067 | |
2013-01-01 | ||||
——- | ||||
-0.605936 | -0.861658 | -1.001924 | 1.528584 | |
2013-01-06 | ||||
——- | ||||
-2.163453 | -0.010279 | 1.699886 | 1.291653 | |
2013-01-02 | ||||
——- | ||||
-0.165408 | 0.388338 | 1.187187 | 1.819818 | |
2013-01-04 | ||||
——- | ||||
1.289305 | 0.497115 | -0.225351 | 0.040239 | |
2013-01-05 | ||||
——- | ||||
0.038232 | 0.875057 | -0.092526 | 0.934432 |
索引
虽然 DataFrame
支持 Python/Numpy
的索引语法,但是推荐使用 .at, .iat, .loc, .iloc 和 .ix
方法进行索引。
读取数据
选择单列数据:
In [17]:
df["A"]
Out[17]:
2013-01-01 -0.605936
2013-01-02 -0.165408
2013-01-03 0.065255
2013-01-04 1.289305
2013-01-05 0.038232
2013-01-06 -2.163453
Freq: D, Name: A, dtype: float64
也可以用 df.A
:
In [18]:
df.A
2013-01-01 -0.605936
2013-01-02 -0.165408
2013-01-03 0.065255
2013-01-04 1.289305
2013-01-05 0.038232
2013-01-06 -2.163453
Freq: D, Name: A, dtype: float64
然后我们使用切片读取多行:
Out[19]:
A | B | C | D | |
---|---|---|---|---|
2013-01-01 | ||||
——- | ||||
-0.605936 | -0.861658 | -1.001924 | 1.528584 | |
2013-01-02 | ||||
——- | ||||
-0.165408 | 0.388338 | 1.187187 | 1.819818 | |
2013-01-03 | ||||
——- | ||||
0.065255 | -1.608074 | -1.282331 | -0.286067 |
index
名字也可以进行切片:
In [20]:
- df["20130101":"20130103"]
Out[20]:
A | B | C | D | |
---|---|---|---|---|
2013-01-01 | ||||
——- | ||||
-0.605936 | -0.861658 | -1.001924 | 1.528584 | |
2013-01-02 | ||||
——- | ||||
-0.165408 | 0.388338 | 1.187187 | 1.819818 | |
2013-01-03 | ||||
——- | ||||
0.065255 | -1.608074 | -1.282331 | -0.286067 |