5.数据分析工具Pandas
2018-01-25 本文已影响40人
零_WYF
1. 什么是Pandas?
Pandas的名称来自于面板数据(panel data)和Python数据分析(data analysis)。
Pandas是一个强大的分析结构化数据的工具集,基于NumPy构建,提供了高级数据结构和数据操作工具,它是使Python成为强大而高效的数据分析环境的重要因素之一。
2. Pandas的数据结构
2.1 Series
Series是一种类似于一维数组的对象,组成:
一组数据(各种NumPy数据类型)
一组与之对应的索引(数据标签)
索引(index)在左,数据(values)在右
索引是自动创建的
2.2 DataFrame
一个表格型的数据结构,它含有一组有序的列,每列可以是不同类型的值。DataFrame既有行索引也有列索引,数据是以二维结构存放的。
类似多维数组/表格数据 (如,excel, R中的data.frame)
每列数据可以是不同的类型
索引包括列索引和行索引
3. 范例
3.1 导入模块
import pandas as pd
3.2 通过list构建Series
ser_obj1 = pd.Series(range(10,31))
print(ser_obj1)
# 打印前三行
print(ser_obj1.head(3))
#############运行结果##################
0 10
1 11
2 12
3 13
4 14
5 15
6 16
7 17
8 18
9 19
10 20
11 21
12 22
13 23
14 24
15 25
16 26
17 27
18 28
19 29
20 30
dtype: int64
0 10
1 11
2 12
dtype: int64
#######################################
3.3 通过dict构建Series
dict = {"a":1,"b":2,"c":3}
ser_obj2 = pd.Series(dict)
print(ser_obj2)
#############运行结果##################
a 1
b 2
c 3
dtype: int64
#######################################
3.4 获取数据和索引
print(ser_obj2.values)
print(ser_obj2.index
#############运行结果##################
[1 2 3]
Index(['a', 'b', 'c'], dtype='object')
#######################################
3.5 通过索引获取数据
print(ser_obj2["b"])
print(ser_obj2[1])
#############运行结果##################
2
2
#######################################
3.6 设置名称
# 对象名
ser_obj2.name = 'zero'
# 对象索引名
ser_obj2.index.name = 'wyf'
print(ser_obj2.head())
#############运行结果##################
wyf
a 1
b 2
c 3
Name: zero, dtype: int64
#######################################
3.7 通过ndarray构建DataFrame
import numpy as np
arr_obj = np.random.rand(3,4)
df_obj = pd.DataFrame(arr_obj)
print(df_obj)
print(df_obj.head(2)) # 查看前两行
#############运行结果##################
0 1 2 3
0 0.267074 0.744870 0.021856 0.758293
1 0.649231 0.119609 0.536336 0.503615
2 0.561522 0.247207 0.280449 0.594249
0 1 2 3
0 0.267074 0.744870 0.021856 0.758293
1 0.649231 0.119609 0.536336 0.503615
#######################################
3.8 通过dict构建DataFrame
dict = {
"A":1,
"B":pd.Timestamp("20180124"),
"C":pd.Series(range(10,14),dtype="float64"),
"D":["python","java","c++","c"],
"E":np.array([3]*4,dtype="int32"),
"F":"zero",
}
df_obj = pd.DataFrame(dict)
print(df_obj)
#############运行结果##################
A B C D E F
0 1 2018-01-24 10.0 python 3 zero
1 1 2018-01-24 11.0 java 3 zero
2 1 2018-01-24 12.0 c++ 3 zero
3 1 2018-01-24 13.0 c 3 zero
#######################################
3.9 通过列索引获取列数据
print(df_obj['A'])
print(type(df_obj['A']))
print(df_obj.A)
#############运行结果##################
0 1
1 1
2 1
3 1
Name: A, dtype: int64
<class 'pandas.core.series.Series'>
0 1
1 1
2 1
3 1
Name: A, dtype: int64
#######################################
3.10 dataframe数据访问
# 通过索引,先列后行
print(df_obj['D'][0])
# 查找指定元素,先找列,再找行
print(df_obj.D[2])
#############运行结果##################
python
c++
#######################################
3.11 增加列数据
df_obj["G"] = "零"
df_obj["H"] = df_obj["C"] + 10
df_obj["I"] = df_obj["C"] * 3
print(df_obj)
#############运行结果##################
A B C D E F G H I
0 1 2018-01-24 10.0 python 3 zero 零 20.0 30.0
1 1 2018-01-24 11.0 java 3 zero 零 21.0 33.0
2 1 2018-01-24 12.0 c++ 3 zero 零 22.0 36.0
3 1 2018-01-24 13.0 c 3 zero 零 23.0 39.0
#######################################
3.12 删除列
del df_obj["H"]
print(df_obj.head())
#############运行结果##################
A B C D E F G I
0 1 2018-01-24 10.0 python 3 zero 零 30.0
1 1 2018-01-24 11.0 java 3 zero 零 33.0
2 1 2018-01-24 12.0 c++ 3 zero 零 36.0
3 1 2018-01-24 13.0 c 3 zero 零 39.0
#######################################
3.13 Series和DataFrame中的索引都是Index对象
print(type(ser_obj.index))
print(type(df_obj.index))
#############运行结果##################
<class 'pandas.core.indexes.range.RangeIndex'>
<class 'pandas.core.indexes.range.RangeIndex'>
#######################################
3.14 index 指定行索引名
# 不指定索引的话,默认从0开始
ser_obj3 = pd.Series(range(5),index = ['a','b','c','d','e'])
print(ser_obj3.head())
#############运行结果##################
a 0
b 1
c 2
d 3
e 4
dtype: int64
#######################################
3.15 行索引
print(ser_obj3['b'])
print(ser_obj3[2]) # 索引号从0开始
#############运行结果##################
1
2
#######################################
3.16 切片索引
print(ser_obj3[1:3])
print(ser_obj3['b':'d'])
#############运行结果##################
print(ser_obj3[1:3])
print(ser_obj3['b':'d'])
print(ser_obj3[1:3])
print(ser_obj3['b':'d'])
b 1
c 2
dtype: int64
b 1
c 2
d 3
dtype: int64
#######################################
3.17 不连续索引
print(ser_obj3[[0,2,4]])
print(ser_obj3[['a','c','e']])
#############运行结果##################
a 0
c 2
e 4
dtype: int64
a 0
c 2
e 4
dtype: int64
#######################################
3.18 布尔索引
ser_bool = ser_obj3 > 2
print(ser_bool)
print(ser_obj3[ser_bool])
print(ser_obj3[ser_obj3 > 2])
#############运行结果##################
a False
b False
c False
d True
e True
dtype: bool
d 3
e 4
dtype: int64
d 3
e 4
dtype: int64
#######################################
3.19 指定列索引名
df_obj = pd.DataFrame(np.random.randn(5,4),columns=['a','b','c','d'])
print(df_obj.head())
#############运行结果##################
a b c d
0 0.939462 -1.064223 -0.874885 1.180462
1 -1.288067 -0.064089 0.855795 0.666919
2 -0.339794 0.560721 0.550258 -0.576895
3 -0.704544 0.622264 0.764208 0.106985
4 -0.079751 0.930942 0.661030 1.267764
#######################################
3.20 列索引
print(df_obj['b'])
#############运行结果##################
0 0.906177
1 0.034646
2 0.497803
3 0.138119
4 0.244221
Name: b, dtype: float64
#######################################
3.21 不连续索引
print(df_obj[['a','c']])
#############运行结果##################
a c
0 0.057483 -0.429583
1 0.703981 -0.441183
2 -1.043533 0.850768
3 1.288697 0.242864
4 0.000106 -0.333193
#######################################
3.22 loc标签索引
print(ser_obj3['b':'d'])
print(ser_obj3.loc['b':'d'])
#############运行结果##################
b 1
c 2
d 3
dtype: int64
b 1
c 2
d 3
dtype: int64
#######################################
3.23 高级索引:标签、位置和混合
print(df_obj['a'])
#############运行结果##################
0 0.939462
1 -1.288067
2 -0.339794
3 -0.704544
4 -0.079751
Name: a, dtype: float64
#######################################
# 第一个参数是索引行,第二个参数是列
print(df_obj.loc[0:2,'a'])
print(df_obj.loc[1:3,['b','c']])
print(df_obj.loc[1:3,'b':'d'])
#############运行结果##################
0 0.939462
1 -1.288067
2 -0.339794
Name: a, dtype: float64
b c
1 -0.064089 0.855795
2 0.560721 0.550258
3 0.622264 0.764208
b c d
1 -0.064089 0.855795 0.666919
2 0.560721 0.550258 -0.576895
3 0.622264 0.764208 0.106985
#######################################
3.24 iloc位置索引
作用和loc一样,不过是基于索引编号来索引
print(ser_obj3[1:3])
print(ser_obj3.iloc[1:3])
print(df_obj.iloc[0:2,0])
#############运行结果##################
b 1
c 2
dtype: int64
b 1
c 2
dtype: int64
0 0.939462
1 -1.288067
Name: a, dtype: float64
#######################################
3.25 ix标签与位置混合索引
# Series
print(ser_obj3.ix[1:3])
print(ser_obj3.ix['b':'c'])
#############运行结果##################
b 1
c 2
dtype: int64
b 1
c 2
dtype: int64
#######################################
# DataFrame
print(df_obj.loc[0:2,'a'])
print(df_obj.ix[0:2,0])
#############运行结果##################
0 0.939462
1 -1.288067
2 -0.339794
Name: a, dtype: float64
0 0.939462
1 -1.288067
2 -0.339794
Name: a, dtype: float64
#######################################
3.26 Series的对其运算
Series 按行、索引对其
ser_obj4 = pd.Series(range(10,20),index = range(10))
ser_obj5 = pd.Series(range(20,25),index = range(5))
print(ser_obj4 + ser_obj5)
#############运行结果##################
0 30.0
1 32.0
2 34.0
3 36.0
4 38.0
5 NaN
6 NaN
7 NaN
8 NaN
9 NaN
dtype: float64
#######################################
print(ser_obj4)
print(ser_obj5)
print(ser_obj4.add(ser_obj5))
# fill_value参数,将Series中未对齐的数据,填充为指定的值,一般指定为0,避免运算误差
print(ser_obj4.add(ser_obj5,fill_value=0))
#############运行结果##################
0 10
1 11
2 12
3 13
4 14
5 15
6 16
7 17
8 18
9 19
dtype: int64
0 20
1 21
2 22
3 23
4 24
dtype: int64
0 30.0
1 32.0
2 34.0
3 36.0
4 38.0
5 NaN
6 NaN
7 NaN
8 NaN
9 NaN
dtype: float64
0 30.0
1 32.0
2 34.0
3 36.0
4 38.0
5 15.0
6 16.0
7 17.0
8 18.0
9 19.0
dtype: float64
#######################################
3.27 DataFrame按行、索引对齐
df1 = pd.DataFrame(np.ones((2,2)),columns = ['a','b'])
df2 = pd.DataFrame(np.ones((3,3)),columns = ['a','b','c'])
print(df1.add(df2))
print(df1.add(df2,fill_value=0))
#############运行结果##################
a b c
0 2.0 2.0 NaN
1 2.0 2.0 NaN
2 NaN NaN NaN
a b c
0 2.0 2.0 1.0
1 2.0 2.0 1.0
2 1.0 1.0 1.0
#######################################
3.28 可直接使用NumPy的函数
df3 = pd.DataFrame(np.random.randn(5,4)-1)
print(df3)
# 绝对值
print(np.abs(df3))
#############运行结果##################
0 1 2 3
0 -0.229173 -2.923527 -2.111435 -2.289574
1 -1.357054 -0.859935 -2.618068 -0.990787
2 -0.618717 -0.277620 -1.687598 -0.201005
3 -1.805256 -0.584533 -0.803320 -1.920048
4 -0.703489 0.283588 -0.183795 -1.499259
0 1 2 3
0 0.229173 2.923527 2.111435 2.289574
1 1.357054 0.859935 2.618068 0.990787
2 0.618717 0.277620 1.687598 0.201005
3 1.805256 0.584533 0.803320 1.920048
4 0.703489 0.283588 0.183795 1.499259
#######################################
3.29 通过apply将函数应用到列或行上
Axis参数可以指定轴向,默认值为0,方向是列,值为1:方向是行
f = lambda x:x.max()
print(df3.apply(f)) # 方向为列
print(df3.apply(f,axis=1)) # 方向为行
#############运行结果##################
0 -0.229173
1 0.283588
2 -0.183795
3 -0.201005
dtype: float64
0 -0.229173
1 -0.859935
2 -0.201005
3 -0.584533
4 0.283588
dtype: float64
#######################################
3.30 通过applymap将函数应用到每个数据上,只用于DataFrame
f1 = lambda x:'%.2f' % x
print(df3.applymap(f1))
f2 = lambda x:x+x
print(df3.applymap(f2))
#############运行结果##################
0 1 2 3
0 -0.23 -2.92 -2.11 -2.29
1 -1.36 -0.86 -2.62 -0.99
2 -0.62 -0.28 -1.69 -0.20
3 -1.81 -0.58 -0.80 -1.92
4 -0.70 0.28 -0.18 -1.50
0 1 2 3
0 -0.458346 -5.847054 -4.222869 -4.579149
1 -2.714108 -1.719869 -5.236136 -1.981574
2 -1.237435 -0.555239 -3.375196 -0.402010
3 -3.610512 -1.169066 -1.606641 -3.840096
4 -1.406977 0.567175 -0.367590 -2.998518
#######################################
3.31 排序
索引排序
# Series
ser_obj6 = pd.Series(range(10,15),index=np.random.randint(5,size=5))
print(ser_obj6)
#############运行结果##################
4 10
1 11
1 12
0 13
3 14
dtype: int64
#######################################
# 降序排序
print(ser_obj6.sort_index(ascending = False))
#############运行结果##################
4 10
3 14
1 11
1 12
0 13
dtype: int64
#######################################
3.32 对DataFrame操作时注意轴方向,默认列,axis=1为行
# DataFrame
df_obj2 = pd.DataFrame(np.random.randn(3,5),
index = np.random.randint(3,size=3),
columns = np.random.randint(5,size=5))
print(df_obj2)
df_obj2_isort = df_obj2.sort_index(axis=1,ascending=False)
print(df_obj2_isort)
#############运行结果##################
0 1 2 3 0
1 0.557994 0.555874 1.899686 -1.334528 0.058536
0 -0.013865 -1.234426 -0.527396 -0.864309 0.599536
2 1.136960 -0.290542 0.452911 0.973588 1.445474
3 2 1 0 0
1 -1.334528 1.899686 0.555874 0.557994 0.058536
0 -0.864309 -0.527396 -1.234426 -0.013865 0.599536
2 0.973588 0.452911 -0.290542 1.136960 1.445474
#######################################
3.33 按值排序-Series对象
# 创建随机Series对象
ser_obj7 = pd.Series(np.random.randint(10,20,size=10))
print(ser_obj7)
print(ser_obj7.sort_values()) # 默认升序
print(ser_obj7.sort_values(ascending = False)) # 降序
#############运行结果##################
0 19
1 17
2 18
3 18
4 19
5 13
6 13
7 16
8 11
9 12
dtype: int32
8 11
9 12
5 13
6 13
7 16
1 17
2 18
3 18
0 19
4 19
dtype: int32
4 19
0 19
3 18
2 18
1 17
7 16
6 13
5 13
9 12
8 11
dtype: int32
#######################################
3.34 按值排序- DataFrame对象
# 如果根据某一个行名/列名来排序,要保证没有其他相同的行名/列名,axis指定排序的轴方向
df4 = pd.DataFrame(np.random.randn(3,5),
index = np.random.randint(3,size=3),
columns = np.random.randint(5,size=5))
print(df4.sort_values(by=2))
print(df4.sort_values(by=2,axis=1))
#############运行结果##################
0 0 3 0 2
0 0.108904 2.141896 0.707657 1.146837 -0.016124
0 0.265732 -0.789782 -0.575320 -0.993737 0.470039
2 -0.080078 0.770228 -0.031199 -0.082614 1.062954
0 0 3 0 2
0 1.146837 0.108904 0.707657 2.141896 -0.016124
0 -0.993737 0.265732 -0.575320 -0.789782 0.470039
2 -0.082614 -0.080078 -0.031199 0.770228 1.062954
#######################################
3.35 处理缺失数据
df_obj5 = pd.DataFrame([
[1,2,np.nan,np.nan],
[np.nan,3,4,np.nan],
list(range(4))
])
print(df_obj5)
#############运行结果##################
0 1 2 3
0 1.0 2 NaN NaN
1 NaN 3 4.0 NaN
2 0.0 1 2.0 3.0
#######################################
3,36 判断是否存在缺失值:isnull()
# 判断是否nan值,如果是返回True,否则False
print(df_obj5.isnull())
#############运行结果###################
0 1 2 3
0 False False True True
1 True False False True
2 False False False False
#######################################
3.37 丢弃缺失数据:dropna()
# 根据axis轴方向,丢弃包含nan的行或者列
print(df_obj5.dropna())
print(df_obj5.dropna(axis=1))
#############运行结果##################
0 1 2 3
2 0.0 1 2.0 3.0
1
0 2
1 3
2 1
#######################################
3.38 填充缺失数据:fillna()
#将nan值替换为指定的值
print(df_obj5.fillna(0))
#############运行结果##################
0 1 2 3
0 1.0 2 0.0 0.0
1 0.0 3 4.0 0.0
2 0.0 1 2.0 3.0
#######################################