Pandas 简介

这个是学习tensorflow前的准备,

pandas 是一种列存数据分析 API。它是用于处理和分析输入数据的强大工具,很多机器学习框架都支持将 pandas 数据结构作为输入。 虽然全方位介绍 pandas API 会占据很长篇幅,但它的核心概念非常简单,我们会在下文中进行说明。有关更完整的参考,请访问 pandas 文档网站,其中包含丰富的文档和教程资源。

基本概念

导入pandas 并输出版本

1
2
3
from __future__ import print_function
import pandas as pd
print(pd.__version__)

0.23.4

pandas中的主要数据结构被时限为一下两类:

DataFrame: 一个关系型数据表格,其中包含多行和已命名的列,就像excel一样
Series:它是单独的一列,DataFrame中包含一个或多个Series,每个Series都有一个名称。就像我们写个表格在第一列写上每一行代表什么一样。

数据框架是用于数据操控的一种常用抽象实现形式,spark中的rdd,数据库中的table 类似。

创建Series的一种方法是构建Series对象。列入:

1
pd.Series(['Beijing', 'Shanghai', 'Shenzhen'])

你可以将映射string列名称的dict传递到它们各自的Series,从而创建DataFrame对象。如果Series在长度上不一致,系统会用特殊的NA值填充缺失的值。

1
2
3
4
5
city_names = pd.Series(['Beijing', 'Shanghai', 'Shenzhen'])
population = pd.Series([21534678, 23541023, 120456])

data = pd.DataFrame({'City name': city_names, 'Population': population})
print(data)
1
2
3
4
  City name  Population
0 Beijing 21534678
1 Shanghai 23541023
2 Shenzhen 120456

大多数情况下,我们需要把整个文件加载到DataFrame中,下面我们加载一个包含加利福尼亚州住房的数据文件。并创建特征定义,通过head方法浏览DataFrame前几个纪录

1
2
3
california_housing_dataframe = pd.read_csv("https://download.mlcc.google.cn/mledu-datasets/california_housing_train.csv", sep=",")
california_housing_dataframe.describe()
print(california_housing_dataframe.head())
1
2
3
4
5
6
7
8
   longitude  latitude         ...          median_income  median_house_value
0 -114.31 34.19 ... 1.4936 66900.0
1 -114.47 34.40 ... 1.8200 80100.0
2 -114.56 33.69 ... 1.6509 85700.0
3 -114.57 33.64 ... 3.1917 73400.0
4 -114.57 33.57 ... 1.9250 65500.0

[5 rows x 9 columns]

pandas的另一个强大的功能是绘图制表,借助DataFrame.hist,可以快速了解一个列中值的分布。pandas使用的画图库是matplotlib所以我们也可以使用这个库中的方法来操作图表。

1
2
3
import matplotlib.pyplot as plt
hist = california_housing_dataframe.hist('housing_median_age')
plt.show()

image

访问数据

可以使用 dict 或list 的方法来访问DataFrame数据

1
2
3
4
5
6
7
8
9
cities = pd.DataFrame({'City name': city_names, 'Population': population})
print(type(cities['City name']))
print(cities['City name'])

print(type(cities['City name'][1]))
print(cities['City name'][1])

print(type(cities[0:2]))
print(cities[0:2])

1
2
3
4
5
6
7
8
9
10
11
12
13
<class 'pandas.core.series.Series'>
0 Beijing
1 Shanghai
2 Shenzhen
Name: City name, dtype: object

<class 'str'>
Shanghai

<class 'pandas.core.frame.DataFrame'>
City name Population
0 Beijing 21534678
1 Shanghai 23541023

操控数据

可以向series应用Python的基本用算指令。

1
2
3
4
population / 1000
0 21534.678
1 23541.023
2 120.456

NumPy是一个用于科学计算的常用工具包。pandas series可作用大多数NumPy函数的参数。

1
2
3
4
5
6
7
import numpy as np
np.log(population)

0 13.655892
1 13.831172
2 13.092314
dtype: float64

对于更加复杂的单列转换,可以使用Series.apply。像Python映射函数一样,Series.apply将以参数形式接受lambda函数,而该函数会应用与每个值,下面的例子是创建一个population是否超过一定数值的series。

1
2
3
4
5
6
print(population.apply(lambda val: val > 1000000))

0 True
1 True
2 False
dtype: bool

DataFrames的修改方式也非常简单。例如,一下代码向现有的DataFrame添加了两个Series。

1
2
3
4
5
6
7
8
cities['Area square miles'] = pd.Series([98.87, 176.53, 46.92])  # 随便写的数
cities['Population density'] = cities['Population'] / cities['Area square miles']
print(cities)

City name ... Population density
0 Beijing ... 217808.010519
1 Shanghai ... 133354.234408
2 Shenzhen ... 2567.263427

练习1

通过添加一个新的布尔值列,修改cities表格

城市以sh开头
城市面积大于50 (上面数都是我随便写的)

注意:布尔值 Series 1 辑与时,应使用 &,而不是 and。

1
2
3
4
5
6
7
8
9
10
cities['Is wide and has Sh name'] = (cities['Area square miles'] > 50) & cities['City name'].apply(lambda name: name.startswith('Sh'))

print(cities)

City name ... Is wide and has Sh name
0 Beijing ... False
1 Shanghai ... True
2 Shenzhen ... False

[3 rows x 5 columns]

索引

Series和DataFrame对象也定义了index属性,改属性向每个Series项或DataFrame行赋一个标识符值。默认情况下,在构造时,pandas会赋可反应数据源数据顺序的索引值。索引值在创建后时稳定的;也就是说,他们不会因为数据重新排序而发生改变。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
print(city_names.index)
RangeIndex(start=0, stop=3, step=1)

print(cities.index)
RangeIndex(start=0, stop=3, step=1)

print(cities.reindex([2, 0, 1]))
City name ... Is wide and has Sh name
2 Shenzhen ... False
0 Beijing ... False
1 Shanghai ... True

[3 rows x 5 columns]

print(cities.reindex(np.random.permutation(cities.index)))
City name ... Is wide and has Sh name
0 Beijing ... False
2 Shanghai ... True
1 Shenzhen ... False

[3 rows x 5 columns]

练习2

reindex方法允许使用未包含在原始DataFrame索引值中的索引值。请示一下,看看如果使用此类值会发生什么。

如果reindex输入数组包含原始DataFrame索引值中没有的值,reindex会为此类“丢失的”索引添加新行,并在所有对应列中填充NaN值

1
2
3
4
5
6
7
8
cities.reindex([0,4,5,2])
City name ... Is wide and has Sh name
0 Beijing ... False
4 NaN ... NaN
5 NaN ... NaN
2 Shenzhen ... False

[4 rows x 5 columns]

这种行为是可取的,因为索引通常是从实际数据中提取的字符串,在这种情况下,如果容许出现“丢失的”索引,将可以轻松的使用外部列表重建索引,因为我们不必担心将输入清理掉。

0%