前言
Pandas基于两种数据类型:series与dataframe。
一个series是一个一维的数据类型,其中每一个元素都有一个标签。series类似于Numpy中元素带标签的数组。其中,标签可以是数字或者字符串。
一个dataframe是一个二维的表结构。Pandas的dataframe可以存储许多种不同的数据类型,并且每一个坐标轴都有自己的标签。你可以把它想象成一个series的字典项。
Pandas常用知识
一、读取csv文件为dataframe
二、dataframe的数据概况
三、取列数据
四、取行数据
五、取某一单元格数据
六、缺失值处理
七、归一化处理
八、排序
九、索引重新编号
十、求均值
十一、矢量化操作(批量操作)
十二、透视表
一、读取csv文件为dataframe
Pandas很好的一点是,可以操作表文件。输出为dataframe格式,这点很nice。 使用pandas.read_csv()读取csv文件,输出为dataframe格式数据。 这里数据data.csv数据集下载自百度地图。
1
2
3
4
5
6
7
8
9
10
11
|
import
pandas
as
pd
filepath
=
r
'C:/Users/lenovo/Desktop/20180108-百度地图/20180108-百度地图/data.csv'
df
=
pd
.
read_csv
(
filepath
)
#为了方便,我只显示三行,其实结果并不是这样子
print
(
df
)
检测下数据格式
#检测下数据格式是否为DataFrame
print
(
type
(
df
)
)
#输出
class
'
pandas
.
core
.
frame
.
DataFrame
|
二、 DataFrame数据概况
我们想知道数据如下知识:
展示dataframe前后几条记录
显示dataframe的列名字
查看dataframe的维度情况(几行几列)
2.1展示dataframe前后几行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#展示前两条记录(根据需要显示条数)
df
.
head
(
2
)
print
(
df
.
head
(
2
)
)
#展示后三条记录
df
.
tail
(
3
)
print
(
df
.
tail
(
3
)
)
2.2展示
dataframe列名
#展示列名
col_names
=
df
.
columns
print
(
col_names
)
#查看下col_names格式
type
(
col_names
)
#将col_names转化为list
col_list
=
col_names
.
tolist
(
)
col_list
|
三、从dataframe中取列数据
使用dataframe[column_name],
返回series格式数据。 series序列数据类似于list,你可以近似等同于list。 只不过返回数据中会多一列index索引。如下面的左侧数字序号
3.1 取一列数据
1
2
3
4
5
6
7
8
9
|
#这里我们一列,如取Name列数据
df
[
'Name'
]
[
:
5
]
print
(
df
[
'Name'
]
[
:
5
]
)
3.2取多列数据
#这里返回的数据还是dataframe格式,为了方便也只显示前几条记录
cols
=
[
'name'
,
'province_name'
,
'city_name'
,
'city_code'
,
'area'
,
'addr'
]
df
[
cols
]
print
(
df
[
cols
]
)
|
四、从dataframe中取行数据(记录)
ix[row, col] 中括号中第一个参数row是行参数,你想选择的数据行数。 第二个参数col是列参数,选择你想要的列数据项。
4.1取一行数据
1
2
3
4
5
6
7
8
|
#这里我们一列,如取Name列数据
df
[
'Name'
]
[
:
5
]
print
(
df
[
'Name'
]
[
:
5
]
)
3.2取多列数据
#这里返回的数据还是dataframe格式,为了方便也只显示前几条记录
cols
=
[
'name'
,
'province_name'
,
'city_name'
,
'city_code'
,
'area'
,
'addr'
]
df
[
cols
]
print
(
df
[
cols
]
)
|
五、取某一单元格数据
取第一行第一列。df.ix[0,0] 第三行第七列。df.ix[2,6]
1
2
3
4
5
6
7
8
|
subset含有一个或多个列名的的
listde
=
"true"
]
#这里我们一列,如取Name列数据
df
[
'Name'
]
[
:
5
]
print
(
df
[
'Name'
]
[
:
5
]
)
3.2取多列数据
#这里返回的数据还是dataframe格式,为了方便也只显示前几条记录
cols
=
[
'name'
,
'province_name'
,
'city_name'
,
'city_code'
,
'area'
,
'addr'
]
df
[
cols
]
print
(
df
[
cols
]
)
|
六、缺失值处理
缺失值一般标记为NaN,处理办法如下
6.1按照行进行缺失值处理
1
2
3
4
5
6
7
8
|
#为了显示方便,只显示前五行。
#axis=1表示按照行方向处理NAN
df
.
dropna
(
axis
=
1
)
6.2按照列进行缺失值处理
#按照列处理缺失值(为显示方便,只显示前5行)
df
.
dropna
(
axis
=
0
)
#对指定列进行缺失值处理
df
.
dropna
(
axis
=
0
,
subset
=
[
'Sex'
,
'Age'
]
)
|
七、归一化处理
数据集中,不同的列的数据可能在不同量级,如果直接进行分析。模型会认为数字大的影响力大,数字小的影响力小。 最终结果可能导致量级小的变量被剔除出模型。因此需要将数据归一化,变成同一量级的数据,这就是归一化操作。 在这里我们只对一列操作下,其余列也需要操作,但为了方便,这里只写一列的归一化处理。
处理步骤:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
1.选取该列的最大值
max_value
=
df
[
col
]
.
max
(
)
2.该列所有值均除以
max
_value
这里要注意,我们会用到
pandas特性,矢量化操作,也就是可以对一个列表进行批量同样的操作。
#这里我们选Fare列进行归一化,先看下Fare的数据
#为了方便显示,只显示了前10个
df
[
'Fare'
]
#这里我们选Fare列进行归一化
max_value
=
df
[
'Fare'
]
.
max
(
)
max_value
#这里我们选Fare列进行归一化
max_value
=
df
[
'Fare'
]
.
max
(
)
max_value
#归一化,并将数据传入新列new_Fare
df
[
'new_Fare'
]
=
df
[
'Fare'
]
/
max_value
df
[
'new_Fare'
]
|
八、排序
1
2
3
4
5
6
7
8
9
|
df
.
sort_values
(
col
,
inplace
,
ascending
)
col
对
col列进行排序
inplace
布尔型值,是否原地操作。
True时,操作结果覆盖掉原数据,原数据被修改
False时,新建一个新数据,原数据未被修改
ascending
布尔型值。升序降序。
False降序,
True升序
#对Age列进行降序操作,不修改原始数据
df
.
sort_values
(
'Age'
,
inplace
=
False
,
ascending
=
False
)
|
九、索引重新
将排序后的索引重新排序
1
2
3
4
5
6
|
将排序后的索引重新排序
df
.
reset_index
(
drop
)
drop
为布尔型值,
True表示修改原始数据的索引。
False保留原始数据索引序列。
df
.
reset_index
(
drop
=
False
)
|
十、求平均值
1
2
3
4
|
10.1所有列的平均值信息
df
.
mean
(
)
10.2
单个列的平均值
df
[
'Age'
]
.
mean
(
)
|
十一、矢量化操作(批量操作)
一般对如list样式的数据批量操作,需要写循环,但是这样费时费力。 pandas基于numpy,可进行矢量化操作,一行就能完成复杂的循环语句,而且运行效率还很高。
1
2
3
4
|
#对Age列批量加10
df
[
'Age'
]
+
10
)
.
head
#对Age列批量减20
df
[
'Age'
]
-
10
|
十二、透视表
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
df
.
pivot_table
(
index
=
col1
,
values
=
col2
,
aggfunc
=
'numpy函数'
)
围绕
index参数列,分析各个
col2,
aggfunc是
np函数,当然这里的
aggfunc也可以是自定义函数。
#分析平均年龄对对生存率的影响。
#0为死亡,1为生存。
#这里我们发现年龄对生存率有影响。
import
numpy
as
np
df
.
pivot_table
(
index
=
'Survived'
,
values
=
'Age'
,
aggfunc
=
np
.
mean
)
#分析仓位等级对生存率影响。0为死亡,1为生存。
#仓位为一等二等三等分别取值1,2,3
#一等舱最高级。我们发现仓位等级对生存也有影响。
df
.
pivot_table
(
index
=
'Survived'
,
values
=
'Pclass'
,
aggfunc
=
np
.
mean
)
pandas提取
html中的表格数据
andas会在网页中寻找任何符合
html表形式的数据,并将其转化
WieDataFrame对象作为返回结果
Code
pandas使用方法
import
pandas
as
pd
#header=1 显示列名;header=0,不显示
pd
.
read_html
(
url
,
header
)
实战代码开始
import
pandas
as
pd
url
=
"http://hz.house.ifeng.com/detail/2014_10_28/50087618_1.shtml"
data
=
pd
.
read_html
(
url
,
header
=
1
)
print
(
data
)
注意啊,这里得到的数据格式是
list。
[
序号
楼盘名称
城区
签约套数
预定套数
签约面积(㎡)
签约均价(元
/㎡)
0
1.0
龙湖春江郦城
滨江
18
0
2178.61
23757.0
1
2.0
海威钱塘之星
滨江
13
0
629.55㎡
17398.0
2
3.0
大家运河之星
拱墅
12
0
1052.72㎡
10457.0
3
4.0
保利城市果岭
下沙
8
0
743.05㎡
10457.0
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
85
86.0
广宇锦绣桃源
拱墅
1
0
86.44㎡
12473.0
86
87.0
景瑞申花壹号院
拱墅
1
0
89.18㎡
21529.0
87
88.0
复地黄龙和山
西湖
0
1
0㎡
0.0
88
89.0
中粮方圆府
下城
0
1
0㎡
0.0
89
90.0
东方铭楼
下沙
0
16
0㎡
0.0
90
NaN
总计签约:
主城区
216
40
21755.55㎡
NaN
[
91
rows
x
7
columns
]
,
2
DataFrame对象
df
.
to_json
(
)
而只要知道数据存储在
DataFrame中,一切都变的简单起来。
比如我很希望数据以
json记形式输出,很简单!这只是一行代码的事情。
import
pandas
as
pd
data
=
pd
.
read_html
(
url
,
header
=
1
)
#data数据是list类型,要先转化为dataframe
df
=
pd
.
DataFrame
(
data
)
df
.
to_json
(
orient
=
'records'
)
df
.
to_csv
(
)
dataframe对象,还可以将数据输出保存为
csv文件
import
pandas
as
pd
data
=
pd
.
read_html
(
url
,
header
=
1
)
df
=
pd
.
DataFrame
(
data
)
#encoding为gbk编码,可以在ofiice excell中看中文不乱吗
df
.
to_csv
(
'data.csv'
,
encoding
=
'gbk'
)
|