Python之Pandas库

Pandas: 数据分析利器。是Python的一个数据分析包,内置了很多了图表。

 

一 Pandas数据结构

1.1 Series一种类似于一维数组的对象,它是由一组数据以及一组与之相关的数据标签组成。仅由一组数据即可产生简单的Series

1.2 DataFrame: 一个表格型的数据结构,含有一组有序的序列,每一列可以是不同的值类型,DataFrame既有行索引也有列索引,可以被看做是由Series组成的字典

 

二 Series

2.1 通过一维数组创建Series

arr = np.array([1,2,3,4,5])
ser1 = Series(arr)
索引:0    value:1
索引:1    value:2
索引:2    value:3
索引:3    value:4
索引:4    value:5
dtype: int32

 

ser1.index
RangeIndex(start=0, stop=5, step=1)

ser1.values
[1 2 3 4 5]

 

索引默认是[0~N-1],我们可以通过index属性来指定索引值

scores = np.array([134,147,125,252])
series = Series(scores,index=['语文','数学','英语','综合科'])
print(series.index)

 

2.2 通过字典方式创建Series

Series可以看做是一个映射,所以可以通过字典来创建Ser

map = {'x':112.5,'y':345,'z':231,'u':999}
series = Series(map)

 

2.3 Series应用Numpy数组运算

# 通过索引取值

Series[0],或者series['x']

# Numpy中数组运算在Series中都保留,并且Series进行数组运算的时候,索引和值之间的映射关系不会变

ser1 = Series([1,3,5,7,9],index=['A','B','C','D','E'])
ser2 = Series([2,4,6,8,10],index=['F','G','H','G','K'])

ser1[ser1 > 2]
ser1[ser1.index == 'A']
ser1 / 2
np.square(ser1)
np.add(ser1,ser2)

 

2.4 Series缺失值检测

在Pandas中,NaN表示不是一个缺失的值或者NA值

Isnull & notnull函数可以用于Series缺失值检测,返回的是一个布尔类型的Series

ser1 = Series([1,3,5,7,9],index=['A','B','C','D','E'])
newIndex = ['A','B','C','D','E','F','G']
ser2 = Series(ser1,index=newIndex)
res1 = pd.isnull(ser2)
res2 = pd.notnull(ser2)
 
ser2[pd.isnull(ser2)]
ser2[pd.notnull(ser2)]

print(ser2)
A    1.0
B    3.0
C    5.0
D    7.0
E    9.0
F    NaN
G    NaN
print(res1)
A    False
B    False
C    False
D    False
E    False
F     True
G     True
print(res2)
A     True
B     True
C     True
D     True
E     True
F    False
G    False

 

 

2.5 Series自动对齐

不同Series之间进行算术运算会对齐不同索引的数据:

num = Series([23,45,67,89],index=['p3','p1','p2','p5'])
price = Series([9.98,2.34,4.56,5.67,8.78],index=['p1','p2','p3','p4','p5'])
total = num * price
print(total)

p1    449.10

p2    156.78

p3    104.88

p4       NaN

p5    781.42

2.6 Series及其索引的name属性

Series对象本身及其索引都有一个name属性,可以赋值设置

num = Series([23,45,67,89],index=['p3','p1','p2','p5'])
num.name = '产品数量'
num.index.name = '产品数量索引'
print(num)

产品数量索引

p3    23

p1    45

p2    67

p5    89

Name: 产品数量, dtype: int64

 

三 DataFrame

3.1 通过二维数组创建DataFrame

arr = np.array(
    [
        ['Tom','Merry','John','Nicky'],
        [76,98,100,88],
        ['Helln','Mary','Adulgt','Colo'],
        [89,68,90,78]
    ]
)

df = DataFrame(arr)
print(df)

 

3.2 通过字典创建DataFrame

d = {
    'Tom':[120,137,115,247],
    'Merry':[111,142,125,232],
    'John':[125,147,105,240],
    'Nicky':[130,137,125,260]
}

df = DataFrame(d)
print(df)

 

3.3 DataFrame的行索引和列索引

我们可以通过index属性设置航索引,通过columns设置列索引

data = {
    'Tom':[120,137,115,247],
    'Merry':[111,142,125,232],
    'John':[125,147,105,240],
    'Nicky':[130,137,125,260]
}

df = DataFrame(data,index=['语文','数学','英语','理综'])
print(df.index)
Index(['语文', '数学', '英语', '理综'], dtype='object')
print(df.columns)
Index(['John', 'Merry', 'Nicky', 'Tom'], dtype='object')
print(df.values)
[[125 111 130 120]
 [147 142 137 137]
 [105 125 125 115]
 [240 232 260 247]]

 

3.4 索引对象

索引对象负责管理轴标签和其他元数据,通过索引可以从Series,DataFrame中取值或对某个位置的值重新赋值

# 通过索引从Series中取值

s = Series([1,2,3,4,5],index=['2001','2002','2003','2004'])
s['2001']
1
s['2001':'2003']
2001    1
2002    2
2003    3
s['2003':]
2003    3
2004    4
2005    5

s[:'2003']
2001    1
2002    2
2003    3

 

# 通过索引从DataFrame中取值

data = {
    'Tom':[120,137,115,247],
    'Merry':[111,142,125,232],
    'John':[125,147,105,240],
    'Nicky':[130,137,125,260]
}

df = DataFrame(data,index=['语文','数学','英语','理综'])
# 取出某一列的值
df['Nicky']
# 取出某一列的值某一行的值
df['Nicky']['理综']
# 取出某一行的值
df.ix[0]
# 取出从第一行到第二行的值
df.ix[0:2]

 

 

四 Pandas常用操作

4.1 重新索引

s = Series([201,45,568,124,88],index=[0,1,2,3,4])
# Series重新索引
s.index=[16,3,5,20,10]
print('重新索引',s)

data = {
    'Tom':[120,137,115,247],
    'Merry':[111,142,125,232],
    'John':[125,147,105,240],
    'Nicky':[130,137,125,260]
}

df = DataFrame(data,index=['语文','数学','英语','理综'])
# DataFrame重新索引
df.index = ['language','math','english','mord']
print(df)

 

4.2 丢弃指定轴上的项

s = Series([201,45,568,124,88],index=[0,1,2,3,4])
# Series重新索引
s.index=[16,3,5,20,10]
print('重新索引',s)

# 丢弃指定轴上的项
s[5] = np.NaN
print('丢弃指定轴上的项',s)
data = {
    'Tom':[120,137,115,247],
    'Merry':[111,142,125,232],
    'John':[125,147,105,240],
    'Nicky':[130,137,125,260]
}

df = DataFrame(data,index=['语文','数学','英语','理综'])
# DataFrame重新索引
df.index = ['language','math','english','mord']
# 丢弃指定轴上的项
df['Tom'] = np.NaN
print('丢弃指定轴上的项',df)

 

丢弃指定轴上的项 16    201.0

3      45.0

5       NaN

20    124.0

10     88.0

dtype: float64

丢弃指定轴上的项           John Merry  Nicky  Tom

language  125    111    130 NaN

math      147    142    137 NaN

english   105    125    125 NaN

mord      240    232    260 NaN

4.3 获取前几行

print(df.head(2))

4.4 数据的快速统计

# 数据的快速统计
print(df.describe())

4.5 通过标签定位和设置值

df.loc['数学','Nicky']
137
df.loc[['数学','语文'],['Nicky','Tom']]
Nicky Tom
数学 137 137 
语文 130 120 
df.loc['数学','Nicky'] = 148
 

 

4.6 排序和排名

# 按照索引值排序,axis=0表示横轴,axis=1表示纵轴,ascending指定是否升序
df.sort_index(axis=0,ascending=True)

 

# 按照某一列的值排序
x = df.sort_values(by='Nicky',ascending=False)

 

4.7 DataFrame切片

# 指定范围切片

df.iloc[0:2]

df.iloc[0:2,2:]

# 指定具体的行和列

df.iloc[[1,2],[3]]

 

4.8 获取指定位置的值

df.iloc[0,2]

df.iat[1,1] //快速获取
4.9 布尔索引

df[df.Nicky > 130]

4.10 整体过滤,所有不满足条件的全部置空

df[df > 120]

 

4.11 isin

过滤数据

df[df['Nicky'].isin([125,260])]

就会把包括该值的数据提取出来

英语 105 125 125 115 
理综 240 232 260 247 

 

4.12 unique

Series获取唯一值,即重复的只获取一个值

 

4.13value_counts

Series计算各个值出现的次数

 

五 处理缺失数据

5.1 缺失值检测

isnull: 检测是否是缺失数据

notnull: 检测是否不是缺失值 

5.2 过滤缺失数据

dropan: 根据标签的值终是否存在缺失数据对轴标签进行过滤(删除),可通过阀值调节对缺失值的容忍度

Series.dropna:只是删除NaN值

# 默认删除是包含NaN值的行,即删除策略时any
DF.dropna()
# 如果某行全部都是NaN才进行删除,及删除策略是all
DF.dropna(how='all')

# 默认某列如果只要有一个包含NaN,则删除
DF.dropna(axis=1)

# 如果某列全部包含NaN,则才删除
DF.dropna(axis=1,how='all')

 

5.3 填充缺失数据

fillna:如果存在缺失值,用指定的值或者插入值方法ffill or bfill填充

# 默认填充填充
DF.fillna(0)
# 根据列索引指定默认值
DF.fillna({'age':18,'salary':-1,'gender':'Unisex'})

 

六 层次化索引

# 在某个方向上拥有多个索引级别

# 通过层次化索引,pandas能够以低维度形式处理高维度的数据

# 通过层次化索引,可以按层级统计数据

6.1Series层次化索引

s = Series([1,2,3,4,5],index=[['X','X','X','Y','Y'],['A','B','C','D','E']])
s.index.names = ['type','label']
print(s)

X    A        1

     B        2

     C        3

Y    D        4

     E        5

 

6.2DataFrame层次化素索引

DF = DataFrame(

    {

       'year':[2015,2015,2016,2016,2017],

       'fruit':['apple','banala','apple','banana','apple'],

       'production':[2345,3432,4556,4455,2453],

       'profits':[2045,3132,4256,4155,2153]

    }

)

newDF = DF.set_index(['year','fruit'])
newDF.index
MultiIndex(levels=[[2015, 2016, 2017], ['apple', 'banala', 'banana']],
           labels=[[0, 0, 1, 1, 2], [0, 1, 0, 2, 0]],
           names=['year', 'fruit'])


6.3 按层级统计数据

# 按照年份统计求和
newDF.sum(level='year')

2015 5777 5177
2016 9011 8411
2017 2453 2153

 

七 Pandas制图

八Matplotlib

Matplotlib是Python中比较著名的绘图库,他提供了一整套和matlab相似的的命令API,十分适合交互式的进行制图。而且也可以方便将它作为绘图控件,嵌入GUI应用程序中。

 

8.1 核心概念

Figure:Figure是一个顶层的容器,我们可以把它理解为画布。这个容器可以包含所有东西

Subplot: Figure中用于画图的一个子区域

Axes: 坐标轴边界,坐标刻度值

Title: 图标题

Grid: 置网格颜色和线性

Xticks: X轴刻度

YTicks: Y轴刻度

XLabel: X轴标签

YLabel: Y轴标签

Line: 设置线条(颜色、线型、宽度等)和标记

Patch: 是填充2D空间的图形对象,如多边形和圆。控制线宽、颜色和抗锯齿设置等。

 

8.2 颜色


8.3 标记


8.4 简单的matplotlib画图实例

X = np.linspace(-np.pi,np.pi,256,endpoint=True)
C,S = np.cos(X),np.sin(X)
plt.plot(X,C)
plt.plot(X,S)
# 创建一个 8 * 6的点的图,并且设置分辨率为80
plt.figure(figsize=(8,6),dpi=80)
# 创建一个 1 * 1的子图,接下来的图会绘制在这个区域
plt.subplot(1,1,1) # 1 *1 的子图绘制在第一块里,目前来说就是唯一的这一块
# 设置X轴上下限
plt.xlim(-4.0,4.0)
# 设置x轴刻度
plt.xticks(np.linspace(-4,4,9,endpoint=True))
# 移动脊柱
ax = plt.gca()
# 去除后边和上边框
ax.spines['right'].set_color('None')
ax.spines['top'].set_color('None')
# 设置x轴和y轴的位置,中心点设置到了0这个位置
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.xaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))
# 绘制余弦曲线,蓝色,连续线,宽度为1像素
plt.plot(X,C,color='b',linewidth=1.0,linestyle=':',label='cos')
# 绘制正弦曲线,蓝色,连续线,宽度为1像素
plt.plot(X,S,color='g',linewidth=1.0,linestyle='-',label='sin')

# 如果要使用这个,必须给plot函数加上label属性
plt.legend(loc ='upper left')
# 保存为图片,72的分辨率
plt.savefig('1.png',dpi=72)

 

8.5matplotlib的输出中文显示问题

解决方案一:

修改matplotlib安装目录(Lib/site-packages/matplotlib)下mpl-data子目录的matplotlibrc文件,去掉font.family和font.sans-serif的注释,并且在font.sans-serif添加FangSong中文字体

解决方案二:

实现以下函数,并调用:

from pylab import mpl
def set_ch():
    mpl.rcParams['font.sans-serif'] = ['FangSong']
    mpl.rcParams['axes.unicode_minus'] = False

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莫言静好、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值