数据科学库pandas笔记1

数据结构之DataFrame

pandas中有两种数据结构Series和DataFrame,Series类似于Numpy中的一维数组，这里就不详细记录了。主要记录下DataFrame的常见使用。

DataFrame是一个表格型的数据结构，它含有一组有序的列，每列可以是不同的值类型（数值、字符串、布尔值等）。DataFrame既有行索引也有列索引，它可以被看做由Series组成的字典（共用同一个索引）。

``````from pandas import Series,DataFrame
import pandas as pd``````

DataFrame基本操作

1. 创建一个DataFrame数据框

``````In [16]: d = {
...:     "name":["cat","dog","lion"],
...:     "age":[3,5,6],
...:     "sex":["male","female","male"]
...: }

In [17]: d
Out[17]:
{'name': ['cat', 'dog', 'lion'],
'age': [3, 5, 6],
'sex': ['male', 'female', 'male']}

In [18]: df = pd.DataFrame(d)

In [19]: df
Out[19]:
name  age     sex
0   cat    3    male
1   dog    5  female
2  lion    6    male``````

2. 查看数据框的概述

``````In [20]: df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2  # 三个索引，从0到2
Data columns (total 3 columns): # 字段信息
name    3 non-null object # 字符串类型
age     3 non-null int64 # 整型
sex     3 non-null object # 字符串类型
dtypes: int64(1), object(2) # 统计数据类型信息
memory usage: 152.0+ bytes # 占用内存大小
``````

3. 切片和索引

3.1 基于列索引进行切片

``````In [24]: df.age
Out[24]:
0    3
1    5
2    6
Name: age, dtype: int64

In [25]: df['age']
Out[25]:
0    3
1    5
2    6
Name: age, dtype: int64

In [26]: df[['age','name']]
Out[26]:
age  name
0    3   cat
1    5   dog
2    6  lion``````

3.2 基于行索引进行切片

``````In [27]: df.ix[0]
D:\work-enviorament\anaconda\Scripts\ipython:1: DeprecationWarning:
.loc for label based indexing or
.iloc for positional indexing

See the documentation here:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated
Out[27]:
name     cat
age        3
sex     male
Name: 0, dtype: object``````

``````In [28]: df.ix[0:1]
D:\work-enviorament\anaconda\Scripts\ipython:1: DeprecationWarning:
.loc for label based indexing or
.iloc for positional indexing

See the documentation here:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated
Out[28]:
name  age     sex
0  cat    3    male
1  dog    5  female

In [29]: df[0:1] # 类似列表的切片操作
Out[29]:
name  age   sex
0  cat    3  male

In [30]: df[0:2]
Out[30]:
name  age     sex
0  cat    3    male
1  dog    5  female``````

``````In [36]: df[0:2]['name']
Out[36]:
0    cat
1    dog
Name: name, dtype: object``````

4. 选取和修改值

``````In [37]: df
Out[37]:
name  age     sex
0   cat    3    male
1   dog    5  female
2  lion    6    male

In [38]: df['age']
Out[38]:
0    3
1    5
2    6
Name: age, dtype: int64

In [39]: df['age'] = 10 # 基于整列的值都修改为10

In [40]: df
Out[40]:
name  age     sex
0   cat   10    male
1   dog   10  female
2  lion   10    male

In [41]: df['age'][0] = 20 # 修改age列的第一行的值为20

In [42]: df
Out[42]:
name  age     sex
0   cat   20    male
1   dog   10  female
2  lion   10    male

In [43]: df.age = [3,4,5] # 为多个字段赋值可以传入一个列表

In [44]: df
Out[44]:
name  age     sex
0   cat    3    male
1   dog    4  female
2  lion    5    male``````

5. 数据的筛选

``````In [44]: df
Out[44]:
name  age     sex
0   cat    3    male
1   dog    4  female
2  lion    5    male

In [46]: df.age == 4 # 逻辑判断，年龄等于4的，返回一个Series的布尔型数组
Out[46]:
0    False
1     True
2    False
Name: age, dtype: bool

In [47]: df[df.age == 4] # 根据这个布尔型数组进行索引，返回为True的
Out[47]:
name  age     sex
1  dog    4  female

In [48]: df[[False,True,False]] # 这种与上面方法是等价的
Out[48]:
name  age     sex
1  dog    4  female

In [51]: df.age > 3 # 大于小于也是可以的
Out[51]:
0    False
1     True
2     True
Name: age, dtype: bool
``````

``````In [54]: df.age == 3
Out[54]:
0     True
1    False
2    False
Name: age, dtype: bool

In [55]: ~(df.age == 3)
Out[55]:
0    False
1     True
2     True
Name: age, dtype: bool``````

``````In [57]: df
Out[57]:
name  age     sex
0   cat    3    male
1   dog    4  female
2  lion    5    male

In [58]: (df.age == 3) & (df.name == 'cat')
Out[58]:
0     True
1    False
2    False
dtype: bool

In [59]: df[(df.age == 3) & (df.name == 'cat')]
Out[59]:
name  age   sex
0  cat    3  male``````

pandas的query函数也可以达到筛选功能

``````In [66]: df.query("age == 3")
Out[66]:
name  age   sex
0  cat    3  male

In [67]: df.query("(age == 3)&(sex=='male')")
Out[67]:
name  age   sex
0  cat    3  male``````

6. 使用loc与iloc

``````In [73]: df
Out[73]:
name  age     sex
0   cat    3    male
1   dog    4  female
2  lion    5    male

In [74]: df.iloc[1] # 根据行标签进行索引，选取行索引为1的行
Out[74]:
name       dog
age          4
sex     female
Name: 1, dtype: object

In [75]: df.iloc[0:2]
Out[75]:
name  age     sex
0  cat    3    male
1  dog    4  female
``````

``````In [76]: df.index = list('abc') # 将行索引改为abc

In [77]: df
Out[77]:
name  age     sex
a   cat    3    male
b   dog    4  female
c  lion    5    male

In [78]: df.loc['a'] # 选取行索引为a的行
Out[78]:
name     cat
age        3
sex     male
Name: a, dtype: object

In [79]: df.loc[['a','b']]
Out[79]:
name  age     sex
a  cat    3    male
b  dog    4  female

In [80]: df.iloc[0] # 同样也可以使用iloc
Out[80]:
name     cat
age        3
sex     male
Name: a, dtype: object
``````

iloc是根据具体的行的位置进行索引的，也就不管行标签是整数还是字符串类型，而loc是根据行标签进行索引的。
loc和iloc还有支持多个参数进行索引

``````In [83]: df
Out[83]:
name  age     sex
a   cat    3    male
b   dog    4  female
c  lion    5    male

In [84]: df.iloc[0:2] # 选取第一行和第二行
Out[84]:
name  age     sex
a  cat    3    male
b  dog    4  female

In [85]: df.iloc[0:2,1] # 选取列，列索引从0开始，所以选取第二列的数据
Out[85]:
a    3
b    4
Name: age, dtype: int64

In [86]: df.iloc[0:2,[0,1]] # 选取多列
Out[86]:
name  age
a  cat    3
b  dog    4
``````

7. 丢弃DataFrame的行或者列

``````In [153]: dd
Out[153]:
name  age     sex
0   cat    3    male
1   dog    5  female
2  lion    6    male

In [154]: dd.drop([1,2])
Out[154]:
name  age   sex
0  cat    3  male``````

``````In [156]: dd
Out[156]:
name  age     sex
0   cat    3    male
1   dog    5  female
2  lion    6    male

In [157]: dd.drop('sex',axis=1)
Out[157]:
name  age
0   cat    3
1   dog    5
2  lion    6

In [158]: dd.drop('sex',axis='columns')
Out[158]:
name  age
0   cat    3
1   dog    5
2  lion    6``````

8. DataFrame行，列的添加

``````In [182]: dd
Out[182]:
name  age
0  cat    2
1  dog    3``````

``````In [190]: row = {'name':'lion','age':4}

In [191]: dd.append(row,ignore_index=True)
Out[191]:
name  age
0   cat    2
1   dog    3
2  lion    4
``````

``````In [206]: dd
Out[206]:
name  age
0  cat    2
1  dog    3

In [207]: dd.loc[4] = ['lion','4']

In [208]: dd
Out[208]:
name age
0   cat   2
1   dog   3
4  lion   4

In [209]: dd.loc[1] = ['dog',5]

In [210]: dd
Out[210]:
name age
0   cat   2
1   dog   5
4  lion   4

``````

数据分析中的常见使用

``````In [97]: df = pd.read_csv('dataAnalyst_gbk.csv',encoding="gbk")

In [98]: df
Out[98]:
city education  top   avg work_year
0   上海        本科    9   8.0        3年
1   广州        硕士   15  11.0        2年
2   广州        本科   12  10.0     应届毕业生
3   北京        本科   13  12.0        2年
4   北京        本科   11   8.0        1年``````

`read_csv函数`默认是以`utf-8`格式进行文件的加载，而这个`dataAnalyst_gbk.csv`文件是gbk格式的，所以需要enconding指定文件格式以解码。如上代码所示，read_csv函数将表格型数据加载为DataFrame对象。

csv文件默认是以逗号为分隔符，如果想指定分隔符，可以使用sep参数，比如下面读取test.csv文件，并且以t为分隔符。

``df = pd.read_csv('test.csv',sep='\t')``

``````In [111]: df = pd.read_csv('dataAnalyst_gbk.csv',encoding="gbk",names=['a','b','c','d','e'])

In [112]: df # 可以看到列标签变成了abcde
Out[112]:
a          b    c    d          e
0  city  education  top  avg  work_year
1    上海         本科    9  8.0         3年
2    广州         硕士   15   11         2年
3    广州         本科   12   10      应届毕业生
4    北京         本科   13   12         2年
5    北京         本科   11    8         1年``````

``````In [116]: df.head()
Out[116]:
city       education  top   avg work_year
0   上海        本科    9   8.0        3年
1   广州        硕士   15  11.0        2年
2   广州        本科   12  10.0     应届毕业生
3   北京        本科   13  12.0        2年
4   北京        本科   11   8.0        1年

Out[117]:
city     education  top avg    work_year
0   上海        本科    9   8.0        3年
1   广州        硕士   15  11.0        2年
2   广州        本科   12  10.0     应届毕业生``````

2. 更改数据类型

``````In [120]: df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 5 columns):
city         5 non-null object
education    5 non-null object
top          5 non-null int64
avg          5 non-null float64
work_year    5 non-null object
dtypes: float64(1), int64(1), object(3)
memory usage: 280.0+ bytes
``````

pandas提供了`astyp()函数`进行数据类型的更改，例如下面将top列的值的数据类型更换为字符串类型。

``````In [122]: df.top
Out[122]:
0     9
1    15
2    12
3    13
4    11
Name: top, dtype: int64 # 默认是int64

In [123]: df.top.astype('str')
Out[123]:
0     9
1    15
2    12
3    13
4    11
Name: top, dtype: object # 已经更改为字符串类型

``````

``````In [124]: df.top = df.top.astype('str')

In [125]: df.top
Out[125]:
0     9
1    15
2    12
3    13
4    11
Name: top, dtype: object

``````

3. 进行一些简单的数值计算以及筛选过滤

``````In [129]: df
Out[129]:
city education  top   avg work_year
0   上海        本科    9   8.0        3年
1   广州        硕士   15  11.0        2年
2   广州        本科   12  10.0     应届毕业生
3   北京        本科   13  12.0        2年
4   北京        本科   11   8.0        1年

In [130]: df['avg_2'] = df.avg*2 # 增加新的一列，数据为avg数值的两倍

In [131]: df
Out[131]:
city education  top   avg work_year  avg_2
0   上海        本科    9   8.0        3年   16.0
1   广州        硕士   15  11.0        2年   22.0
2   广州        本科   12  10.0     应届毕业生   20.0
3   北京        本科   13  12.0        2年   24.0
4   北京        本科   11   8.0        1年   16.0``````

``````In [133]: df.query('avg>10')
Out[133]:
city education  top   avg work_year  avg_2
1   广州        硕士   15  11.0        2年   22.0
3   北京        本科   13  12.0        2年   24.0

In [134]: df.query('avg>10').city
Out[134]:
1    广州
3    北京
Name: city, dtype: object``````

5 人关注
18 篇文章