使用pandas

Pandas 是基于 numpy 用来进行数据处理、数据分析的的 Python 库,和 scikit-learn 等机器学习包配合起来有奇效。

网站及其相关文档: http://pandas.pydata.org/

一、Pandas 基本数据结构

1. Series

Series 是 pandas 中常用的数据结构 ,以 index-data 索引值与数据值对的形式储存。用 Python for Data Analysis 书中的话说,Series 是一个 定长的、有序的字典。结合了 list 和 dict 的特征。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from pandas import                # 对 Series 进行一些简单的介绍

s = Series([1,'hello','a',32.0]) # 与 list 一样,Series 可以存储任意数据类型
s.values # s 具有一些属性
s.index
# s 的索引属性,Series 也可以修改索引值,(变成了dict)

s2 = Series([100,'hello','s'],index=['num','title','mark'])
# 第一种自定义index Series 对象的方法
sdict = {'num':100,'title':'hello','mark':'s'}
# 还可以用直接传入字典的方式构建 Series 对象
s2 = Series(sdict)
# 通过这样的声明方式来修改索引值
>>> s2['num']
>>> 100 # 这样就可以通过类似字典的方式来读取数据

s2.name = 'pop'
# Series 对象可以赋予一个 name 属性,类似于表中的字段名称,这与pandas的一些重要功能是相符的。

2. DataFrame

DataFrame 是 pandas 中的表格数据结构,包含一个经过排序的列表集。可以看作是一个“嵌套列表”或者是key是字段名,value是一个数据Series的大型字典。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}
frame = DataFrame(data) # data 的表示方式就类似于一个 DataFrame的数据结构
>>> frame
>>>
pop state year
0 1.5 Ohio 2000
1 1.7 Ohio 2001
2 3.6 Ohio 2002
3 2.4 Nevada 2001
4 2.9 Nevada 2002 # 在这个表中,pop 等columns 是字典的key 0,1,2等是内部 Series 的索引值
f2 = DataFrame(frame, columns=['pop','state','year'])
# 还可以这样改变 key 的顺序

二、使用 Pandas 处理数据

1. 直接将csv文件读取为DataFrame

以最近在做的天池数据竞赛中的某个表为例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
In [29]: from pandas import DataFrame,Series

In [30]: import pandas as pd

In [31]: data = pd.read_csv('result1.csv')

In [32]: data.describe() # 可以看出读取的形式是 DataFrame
Out[32]:
time init count sort hot
count 6.166800e+05 6.166800e+05 6.166800e+05 616680.000000 616680.000000
mean 4.160684e+06 2.536660e+04 1.246682e+08 6098.808620 2.931601
std 3.049515e+06 1.604409e+05 1.249575e+09 3634.705681 3.157553
min 9.000000e+04 0.000000e+00 1.620000e+02 3.000000 1.000000
25% 2.163600e+06 6.250000e+02 1.072000e+04 3073.000000 1.000000
50% 3.661200e+06 2.057000e+03 1.031440e+05 6036.500000 1.000000
75% 5.115600e+06 7.653000e+03 1.398914e+06 9260.000000 5.000000
max 2.095200e+07 7.048087e+06 5.138252e+10 12233.000000 90.000000

In [33]: data.head()
Out[33]:
song_id artist_id time \
0 f9b34fa19fae8bfd03edaebd85b5cc52 3e395c6b799d3d8cb7cd501b4503b536 187200
1 f9b34fa19fae8bfd03edaebd85b5cc52 3e395c6b799d3d8cb7cd501b4503b536 273600
2 f9b34fa19fae8bfd03edaebd85b5cc52 3e395c6b799d3d8cb7cd501b4503b536 360000
3 f9b34fa19fae8bfd03edaebd85b5cc52 3e395c6b799d3d8cb7cd501b4503b536 446400
4 f9b34fa19fae8bfd03edaebd85b5cc52 3e395c6b799d3d8cb7cd501b4503b536 532800

init count sort hot
0 10351 2231034 4253 1
1 10351 2231034 4253 1
2 10351 2231034 4253 1
3 10351 2231034 4253 1
4 10351 2231034 4253 1

In [34]: data.shape
Out[34]: (616680, 7)

2. pandas 和 scikit-learn 一起处理机器学习问题

以上文处理的数据集为例,第3-6列

3. Pandas 常用统计方法

1
2
3

DF = DataFrame(data1)
S = Series(data2) # DF 和 S 分别代表两个数据结构的实例