跟我一起学scikit-learn05:Pandas简介

Pandas是一个强大的时间序列数据处理工具包,最初开发的目的是为了分析财经数据,现在已经广泛应用在Python数据分析领域。本节通过简单的介绍,让读者熟悉简单的Pandas概念及操作。

1.基本数据结构

Pandas最基础的数据结构是Series,用它来表达一行数据,可以理解为一维数组。比如下面的代码,创建了一个包含6个数据的一维数组。

In [1]: import pandas as pd
In [2]: s = pd.Series([4,2,5,0,6,3])
In [3]: s
Out[3]:
0    4
1    2
2    5
3    0
4    6
5    3
dtype: int64

Series会自动为数据加上索引,默认是从0开始的连续索引,也可以自己指定索引。

另一个关键的数据结构是DataFrame,它表示的是二维数据。下面的代码会创建一个DataFrame对象。

In [6]: import numpy as np
In [7]: df = pd.DataFrame(np.random.randn(6,4),columns=list('ABCD'))
In [8]: df
Out[8]:
          A         B         C         D
0 -0.647598 -0.584578 -1.647857 -0.995705
1 -2.062707  1.293265  0.246728 -0.096330
2 -2.218540 -0.484086 -1.400132 -0.824412
3 -1.952414 -1.558925  0.993463 -0.197446
4 -0.346778  0.387028  0.391962  1.186592
5 -0.945258 -1.609624  0.823679  0.420984

其实,DataFrame对象里的数据使用Numpy的array对象保存的,可以使用df.values来查看原始数据。DataFrame对象的每一行和每一列都是一个Series对象,可以使用行索引来访问一行数据,也可以使用列索引来访问一列数据。

In [9]: df.iloc[0]
Out[9]:
A   -0.647598
B   -0.584578
C   -1.647857
D   -0.995705
Name: 0, dtype: float64

In [10]: df.A
Out[10]:
0   -0.647598
1   -2.062707
2   -2.218540
3   -1.952414
4   -0.346778
5   -0.945258
Name: A, dtype: float64

In [11]: print("Row data type: {}".format(type(df.iloc[0])))
Row data type: <class 'pandas.core.series.Series'>

In [12]: print("Column data type: {}".format(type(df.A)))
Column data type: <class 'pandas.core.series.Series'>

Pandas提供了简洁的数据访问功能,通过DataFrame.shape可以查看数据的维度信息:

In [13]: df.shape
Out[13]: (6, 4)

通过DataFrame.head()和DataFrame.tail()方法可以访问数据的前N行和后N行:

In [14]: df.head(3)
Out[14]:
          A         B         C         D
0 -0.647598 -0.584578 -1.647857 -0.995705
1 -2.062707  1.293265  0.246728 -0.096330
2 -2.218540 -0.484086 -1.400132 -0.824412

In [15]: df.tail(2)
Out[15]:
          A         B         C         D
4 -0.346778  0.387028  0.391962  1.186592
5 -0.945258 -1.609624  0.823679  0.420984

通过DataFrame.index和DataFrame.columns属性可以访问数据的行索引和列索引信息:

In [16]: df.index
Out[16]: RangeIndex(start=0, stop=6, step=1)

In [17]: df.columns
Out[17]: Index(['A', 'B', 'C', 'D'], dtype='object')

通过DataFrame.describe()方法,可以算出简单的数据统计信息。

In [18]: df.describe()
Out[18]:
              A         B         C         D
count  6.000000  6.000000  6.000000  6.000000
mean  -1.362216 -0.426153 -0.098693 -0.084386
std    0.810921  1.125157  1.139938  0.807694
min   -2.218540 -1.609624 -1.647857 -0.995705
25%   -2.035134 -1.315338 -0.988417 -0.667670
50%   -1.448836 -0.534332  0.319345 -0.146888
75%   -0.722013  0.169250  0.715750  0.291655
max   -0.346778  1.293265  0.993463  1.186592

从输出可以看出,describe()计算出每列的元素个数、平均值、标准差、最小值、最大值及几种中位数的值。

2.数据排序

通过DataFrame.sort_index()函数可以方便地对索引进行排序。比如,根据列名进行逆序排列:

In [19]: df.sort_index(axis=1,ascending=False)
Out[19]:
          D         C         B         A
0 -0.995705 -1.647857 -0.584578 -0.647598
1 -0.096330  0.246728  1.293265 -2.062707
2 -0.824412 -1.400132 -0.484086 -2.218540
3 -0.197446  0.993463 -1.558925 -1.952414
4  1.186592  0.391962  0.387028 -0.346778
5  0.420984  0.823679 -1.609624 -0.945258

也可以通过DataFrame.sort_values()函数对数值进行排序。比如,根据B列的数据从小到大排序:

In [19]: df.sort_index(axis=1,ascending=False)
Out[19]:
          D         C         B         A
0 -0.995705 -1.647857 -0.584578 -0.647598
1 -0.096330  0.246728  1.293265 -2.062707
2 -0.824412 -1.400132 -0.484086 -2.218540
3 -0.197446  0.993463 -1.558925 -1.952414
4  1.186592  0.391962  0.387028 -0.346778
5  0.420984  0.823679 -1.609624 -0.945258

3.数据访问

Pandas可以方便地对数据进行选择和访问。我们可以通过行索引范围来访问特定几行的数据,这个和Numpy类似。

In [24]: df[3:5]
Out[24]:
          A         B         C         D
3 -1.952414 -1.558925  0.993463 -0.197446
4 -0.346778  0.387028  0.391962  1.186592

还可以选择列,如选择A、B、D这3列数据。

In [25]: df[['A','B','D']]
Out[25]:
          A         B         D
0 -0.647598 -0.584578 -0.995705
1 -2.062707  1.293265 -0.096330
2 -2.218540 -0.484086 -0.824412
3 -1.952414 -1.558925 -0.197446
4 -0.346778  0.387028  1.186592
5 -0.945258 -1.609624  0.420984

还可以使用DataFrame.loc()函数通过标签来选择某个元素,或使用DataFrame.iloc()函数通过数据索引来访问某个元素。

In [26]: df.loc[3,'A']
Out[26]: -1.952414252594135

In [27]: df.iloc[2:5,0:2]
Out[27]:
          A         B
2 -2.218540 -0.484086
3 -1.952414 -1.558925
4 -0.346778  0.387028

还可以通过布尔值来选择,例如可以选择C列里所有大于0的数据所在的行。

In [28]: df[df.C>0]
Out[28]:
          A         B         C         D
1 -2.062707  1.293265  0.246728 -0.096330
3 -1.952414 -1.558925  0.993463 -0.197446
4 -0.346778  0.387028  0.391962  1.186592
5 -0.945258 -1.609624  0.823679  0.420984

可以很方便地对数据进行修改,例如可以添加一列,列名为TAG。

In [29]: df["TAG"] = ["cat","dog","cat","cat","cat","dog"]

In [30]: df
Out[30]:
          A         B         C         D  TAG
0 -0.647598 -0.584578 -1.647857 -0.995705  cat
1 -2.062707  1.293265  0.246728 -0.096330  dog
2 -2.218540 -0.484086 -1.400132 -0.824412  cat
3 -1.952414 -1.558925  0.993463 -0.197446  cat
4 -0.346778  0.387028  0.391962  1.186592  cat
5 -0.945258 -1.609624  0.823679  0.420984  dog

接着可以根据TAG列做分组统计。

In [31]: df.groupby('TAG').sum()
Out[31]:
            A         B         C         D
TAG
cat -5.165329 -2.240561 -1.662564 -0.830970
dog -3.007965 -0.316359  1.070407  0.324653

4.时间序列

Pandas提供了强大的时间序列处理功能,我们可以创建以时间序列为索引的数据集。比如,以2000年1月1日作为起始日期,创建366条记录数据。

In [32]: n_items = 366
In [33]: ts = pd.Series(np.random.randn(n_items),index=pd.date_range('20000101',periods=n_items))
In [34]: print(ts.shape)
(366,)
In [35]: ts.head(5)
Out[35]:
2000-01-01   -0.012701
2000-01-02   -1.210897
2000-01-03   -0.403395
2000-01-04    0.524877
2000-01-05    0.242297
Freq: D, dtype: float64

我们可以对这些数据按照月份聚合。

In [36]: ts.resample("1m").sum()
Out[36]:
2000-01-31     2.570576
2000-02-29    -2.203793
2000-03-31    -1.847025
2000-04-30     0.778170
2000-05-31    -7.887749
2000-06-30    -1.685934
2000-07-31    -9.150933
2000-08-31     8.215351
2000-09-30    -8.704664
2000-10-31    12.668705
2000-11-30    -0.668731
2000-12-31     7.834419
Freq: M, dtype: float64

5.数据可视化

我们还可以对数据进行可视化。下面的代码,先计算ts序列的累加值,然后把数据按照时间序列画出来,如图所示。

In [39]: import matplotlib.pyplot as plt

In [40]: plt.figure(figsize=(10,6),dpi=144)
Out[40]: <Figure size 1440x864 with 0 Axes>

In [41]: cs = ts.cumsum()

In [42]: cs.plot()
Out[42]: <matplotlib.axes._subplots.AxesSubplot at 0xa9eb0f0>

In [43]: plt.show()

Figure2_6.png
还可以按月累加,并把每个月的累加值当成柱状图画出来,如图所示。

In [44]: plt.figure(figsize=(10,6),dpi=144)
Out[44]: <Figure size 1440x864 with 0 Axes>

In [45]: ts.resample("1m").sum().plot.bar()
Out[45]: <matplotlib.axes._subplots.AxesSubplot at 0xc86f6f0>

In [46]: plt.show()

Figure2_7.png
Pandas画图使用的工具包是Matplotlib。Pandas只是做了相应的封装,方便调用而已。

6.文件读写

最常用的是,可以使用DataFrame.to_csv()函数把数据保存到CSV文件中,使用DataFrame.read_csv()函数可以从CSV文件中加载数据到一个DataFrame对象中。

In [11]: df
Out[11]:
          A         B         C         D
0  0.202463  1.868181 -1.162908  0.339988
1 -1.786176  0.646831 -0.771916  0.315640
2 -0.583299  0.241443 -1.240619  1.029839
3 -0.850583 -0.375631  0.011961  0.846083
4  0.522004 -0.791849 -0.202503 -0.089799
5 -0.074567 -0.775279  0.873800  0.898088

In [15]: df.to_csv('a.txt',index=None)

In [16]: a = pd.read_csv('a.txt')

In [17]: a
Out[17]:
          A         B         C         D
0  0.202463  1.868181 -1.162908  0.339988
1 -1.786176  0.646831 -0.771916  0.315640
2 -0.583299  0.241443 -1.240619  1.029839
3 -0.850583 -0.375631  0.011961  0.846083
4  0.522004 -0.791849 -0.202503 -0.089799
5 -0.074567 -0.775279  0.873800  0.898088
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值