数据分析之Pandas库
1 Pandas介绍
Pandas由WesMcKinney开发,是一种专门用于数据挖掘的库。其以Numpy库为基础,借力Numpy模块在计算方面性能高的优势来增强性能。也基于matplotlib库,能够简便绘图,并且有着独特的数据结构。
2 使用Pandas的优势
Numpy已近可以帮助我们解决问题,能够结合Matplotlib解决部分数据的展示等问题,那为什么要使用Pandas,使用它的优势主要有以下几个部分:
- 增强图表的可读性
- 便捷的数据处理能力
- 读取文件特别方便
- 封装了Matplotlib的画图和Numpy的计算
3 Pandas数据结构
Pandas一共有三种数据结构,分别是Series、DataFrame和MultiIndex。三者分别是一维数据结构、二维数据结构和三维数据结构。
➢ Series结构
Series是一个类似于一维数组结构,它能够保存任何数据类型的数据,如整数、字符串、浮点数等,主要由一组数据和与之相关联的数组两部分组成。
Series的创建(通过已有数据创建):
import pandas as pd
# data:传入的数据,可以是ndarray、list等
# index:索引,必须是唯一且与数据的长度相等,如果没有传入索引参数,则默认会自动创建一个从0~N的整数索引
# dtype:数据类型
pd.Series(data=None, index=None, dtype=None)
- 指定内容默认索引创建
import pandas as pd
import numpy as np
pd.Series(data=np.arange(10))
- 指定索引创建
import pandas as pd
pd.Series(data=[6, 7, 8, 9, 10], index=[0, 1, 2, 3, 4])
- 通过字典数据创建
import pandas as pd
pd.Series(data={'name': 'thanlon', 'age': 24, 'address': '中国上海'})
为更方便地操作Series对象中的索引和数据,Series中提供两个属性,分别是index和values。Series的属性:
- index
import pandas as pd
staff = pd.Series(data={'name': 'thanlon', 'age': 24, 'address': '中国上海'})
print('职员的姓名:',staff[0])
print('职员的年龄:',staff['age'])
print(staff.index)
- values
import pandas as pd
staff = pd.Series(data={'name': 'thanlon', 'age': 24, 'address': '中国上海'})
print(staff.values) # <class 'numpy.ndarray'>
➢ DataFrame结构:
DataFrame是一个类似于二维数组或表格的对象,既有行索引和列索引。DataFrame的创建:
import pandas as pd
# index:行标签,如果没有传入索引参数,则默认会自动创建一个从0~N的整数索引
# columns:列标签,如果没有传入索引参数,则默认会自动创建一个从0~N的整数索引
pd.DataFrame(data=None, index=None, columns=None)
例一:
import pandas as pd
import numpy as np
pd.DataFrame(data=np.random.randn(2, 3))
例二:
# 分别使用numpy和pandas生成学生的成绩表,生成10个同学的6个科目的成绩
import numpy as np
score = np.random.randint(0, 100, (10, 6))
print(score)
score_df = pd.DataFrame(score)
score_df
增加行列索引:
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
print(score)
score_df = pd.DataFrame(score)
print(score_df)
# 构建行索引序列
subjects = ['语文', '数学', '英语', '历史', '政治', '数学']
# 构建列索引序列
stu = ['学生'+str(i+1) for i in range(score_df.shape[0])]
# 添加行索引
data = pd.DataFrame(data=score, index=stu, columns=subjects)
data
DataFrame的属性:
- shape:查看几行几列
'''
查看几行几列
'''
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['语文', '数学', '英语', '历史', '政治', '数学']
stu = ['学生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score, index=stu, columns=subjects)
print(data.shape)
data
- index:获取行索引列表
'''
获取行索引列表
'''
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['语文', '数学', '英语', '历史', '政治', '数学']
stu = ['学生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score, index=stu, columns=subjects)
print(data.index)
data
- columns:获取列索引列表
'''
获取列索引列表
'''
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['语文', '数学', '英语', '历史', '政治', '数学']
stu = ['学生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score, index=stu, columns=subjects)
print(data.columns)
data
- values:获取数组的值
'''
获取数组的值
'''
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['语文', '数学', '英语', '历史', '政治', '数学']
stu = ['学生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score, index=stu, columns=subjects)
print(data.values)
data
- T:转置
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['语文', '数学', '英语', '历史', '政治', '数学']
stu = ['学生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score, index=stu, columns=subjects)
data.T
- head(n):查看前n行,如果不传入n,默认是5行。如果数据没有5行,则默认查看所有行。
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['语文', '数学', '英语', '历史', '政治', '数学']
stu = ['学生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score, index=stu, columns=subjects)
data.head(4)
- tail(n):查看后n行,如果不传入n,默认是5行。如果数据没有5行,则默认查看所有行。
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['语文', '数学', '英语', '历史', '政治', '数学']
stu = ['学生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score, index=stu, columns=subjects)
data.tail(2)
DataFrame索引的设置:
- 修改行列索引值
'''
必须整体全部修改,不能使用索引方式改局部,如data.index[0] = '学生_1'
'''
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['语文', '数学', '英语', '历史', '政治', '数学']
stu = ['学生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score, index=stu, columns=subjects)
stu1 = ['学生_'+str(i+1) for i in range(score_df.shape[0])]
data.index = stu1
data
- 重设索引
'''
使用reset_index(drop=False),可以用来设置新的下标索引,drop:默认是False,不删除原来的索引,如果为True,删除原来的索引值
不删除原来的索引
'''
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['语文', '数学', '英语', '历史', '政治', '数学']
stu = ['学生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score, index=stu, columns=subjects)
data = data.reset_index()
data
'''
使用reset_index(drop=False),可以用来设置新的下标索引,drop:默认是False,不删除原来的索引,如果为True,删除原来的索引值
删除原来的索引
'''
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['语文', '数学', '英语', '历史', '政治', '数学']
stu = ['学生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score, index=stu, columns=subjects)
data = data.reset_index(drop=True)
data
- 以某列值设置为新的索引
'''
设置新的索引:set_index(keys, drop=True)
keys:列索引名称或列索引名称的列表
drop:boolean类型,默认是True,当做新的索引,删除原来的列
以月份设置新的索引
'''
import pandas as pd
df = pd.DataFrame({
'month': [1, 2, 3, 4],
'year': [2017,2018, 2019, 2020],
'sale': [66, 77, 88, 99]
})
df = df.set_index('month') # 设置单个索引
df
'''
设置新的索引:set_index(keys, drop=True)
keys:列索引名称或列索引名称的列表
drop:boolean类型,默认是True,当做新的索引,删除原来的列
以年份和月份设置新的索引
'''
import pandas as pd
df = pd.DataFrame({
'month': [1, 2, 3, 4],
'year': [2017, 2018, 2019, 2020],
'sale': [66, 77, 88, 99]
})
df = df.set_index(['year', 'month']) # 设置多个索引,要使用列表
df
DataFrame通过修改可以变成MultiIndex结构。
➢ MultiIndex结构
MultiIndex是三维的数据结构,即多级索引,也称为层次化的索引。层次化索引是pandas的重要功能,可以在Series、DataFrame对象上拥有2个及其以上的索引。除了通过修改DataFrame数据结构变成MulitiIndex结构,还可以直接创建。
MultiIndex的创建:
import pandas as pd
arrays = [['thanlon', 'kiku', 'kili'], [22, 23, 24]]
pd.MultiIndex.from_arrays(arrays=arrays, names=('name', 'age'))
MultiIndex的特性:
'''
index
'''
import pandas as pd
df = pd.DataFrame({
'month': [1, 2, 3, 4],
'year': [2017, 2018, 2019, 2020],
'sale': [66, 77, 88, 99]
})
df = df.set_index(['year', 'month'])
df.index
'''
index.names
'''
import pandas as pd
df = pd.DataFrame({
'month': [1, 2, 3, 4],
'year': [2017, 2018, 2019, 2020],
'sale': [66, 77, 88, 99]
})
df = df.set_index(['year', 'month'])
df.index.names
import pandas as pd
df = pd.DataFrame({
'month': [1, 2, 3, 4],
'year': [2017, 2018, 2019, 2020],
'sale': [66, 77, 88, 99]
})
df = df.set_index(['year', 'month'])
df.index.levels
import pandas as pd
df = pd.DataFrame({
'month': [1, 2, 3, 4],
'year': [2017, 2018, 2019, 2020],
'sale': [66, 77, 88, 99]
})
df = df.set_index(['year', 'month'])
df.index.codes
➢ Panel结构(Panel已被废弃,这里只作了解)
Panel是MultiIndex的前身,Panel的创建:
'''
pandas.Panel(data-None, items=None, major_axis=None, minor_axis=None):存储3维数组的Panel结构
data:ndarray或者DataFrame,表示整体的数据
items:索引或类似数组的对象,axis=0
major_axis:索引或类似数组的对象,axis=1
minor_axis:索引或类似数组的对象,axis=2
'''
import pandas as pd
import numpy as np
# 24个数,第一个维度是4,第二个维度是3,第三个维度是2,三维
data = np.arange(24).reshape(4, 3, 2)
items = list('ABCD') # ['A', 'B', 'C', 'D']
major_axis = pd.date_range('20200227', periods=3) # DatetimeIndex(['2020-02-27', '2020-02-28', '2020-02-29'], dtype='datetime64[ns]', freq='D')
minor_axis = ['first', 'second']
pd.Panel(data=data, items=items, major_axis=major_axis, minor_axis=minor_axis)
Panel数据的查看:
import pandas as pd
import numpy as np
# 24个数,第一个维度是4,第二个维度是3,第三个维度是2,三维
data = np.arange(24).reshape(4, 3, 2)
items = list('ABCD') # ['A', 'B', 'C', 'D']
major_axis = pd.date_range('20200227', periods=3) # DatetimeIndex(['2020-02-27', '2020-02-28', '2020-02-29'], dtype='datetime64[ns]', freq='D')
minor_axis = ['first', 'second']
p = pd.Panel(data=data, items=items,
major_axis=major_axis, minor_axis=minor_axis)
p[:, :, 'first'] # :表示取所有
p['A', :, :]
4 基本数据操作
➢ 索引操作
直接使用行列索引(先行后列):
结合loc或者iloc使用索引:
使用ix组合索引:
5 DataFrame运算
6 Pandas绘图
➢ Pandas.Series绘图
绘制折线图:
import pandas as pd
import numpy as np
import random
data = []
for i in np.arange(0, 100, 10):
data.append(random.randint(10, 20))
s = pd.Series(data=data)
print(s)
s.plot(kind='line') # s.plot.line(),s.plot()函数的参数kind默认是'line'
绘制柱状图:
import pandas as pd
import numpy as np
import random
data = []
for i in np.arange(0, 100, 10):
data.append(random.randint(10, 20))
s = pd.Series(data=data)
print(s)
s.plot(kind='bar')
import pandas as pd
import numpy as np
import random
data = []
for i in np.arange(0, 100, 10):
data.append(random.randint(10, 20))
s = pd.Series(data=data)
print(s)
s.plot(kind='barh')
绘制直方图:
import pandas as pd
import numpy as np
import random
data = []
for i in np.arange(0, 100, 10):
data.append(random.randint(10, 20))
data = np.random.normal(1.75, 1, 10000)
s = pd.Series(data=data)
print(s)
s.plot(kind='hist')
➢ Pandas.DataFrame绘图
绘制折线图:
import pandas as pd
import numpy as np
data = np.random.randn(10, 2) # 从标准动态分布中返回一个或多个样本值
print(data)
df = pd.DataFrame(data=data)
print(df)
df.plot(kind='line') # df.plot()函数的参数kind默认是'line'
绘制柱状图:
import pandas as pd
import numpy as np
data = np.random.randn(10, 3) # 从标准动态分布中返回一个或多个样本值
print(data)
df = pd.DataFrame(data=data)
print(df)
df.plot(kind='bar') # df.plot.line(),df.plot()函数的参数kind默认是'line'
import pandas as pd
import numpy as np
data = np.random.randn(10, 3) # 从标准动态分布中返回一个或多个样本值
df = pd.DataFrame(data=data)
df.plot(kind='barh') # df.plot()函数的参数kind默认是'line'
绘制直方图:
import pandas as pd
import numpy as np
data = np.random.randn(10, 3) # 从标准动态分布中返回一个或多个样本值
print(data)
df = pd.DataFrame(data=data)
print(df)
df.plot(kind='hist') # df.plot()函数的参数kind默认是'line'
7 文件读取与存储
➢ CSV格式文件的读取与存储
test.csv:
CSV格式文件的读取:
'''
读取数据,并且指定只获取age和addr指标
'''
import pandas as pd
pd.read_csv(filepath_or_buffer='test.csv')
# filepath_or_buffer:文件路径;usecols:指定读取的列名;sep:默认是以逗号分割
pd.read_csv(filepath_or_buffer='test.csv', usecols=['name', 'age'], sep=',')
CSV格式文件的存储:
'''
存储数据
'''
import pandas as pd
data = pd.read_csv(filepath_or_buffer='test.csv',
usecols=['name', 'age'], sep=',')
# to_csv的参数,columns:选择需要的列索引;header:是否写进列索引值,默认是True;index:是否写进索引,默认是True。mode:重写(w)与追加(a)
data.to_csv(path_or_buf='tmp.csv', columns=[
'name'], header=True, index=None, mode='w')
data = pd.read_csv(filepath_or_buffer='tmp.csv')
data
'''
存储数据,不保存索引
'''
import pandas as pd
data = pd.read_csv(filepath_or_buffer='test.csv', usecols=['name', 'age'], sep=',') #
data.to_csv(path_or_buf='tmp.csv',columns=['name'],index=False)
data = pd.read_csv(filepath_or_buffer='tmp.csv')
data
➢ HDF5格式文件的读取与存储
创建HDF5文件:
首先安装h5py模块:thanlon@thanlon-master:~$ sudo pip3 install h5py -i https://pypi.tuna.tsinghua.edu.cn/simple
创建好的HDF5文件:
import h5py
f = h5py.File('hd.h5', 'w')
lst1 = ['thanlon', 'kiku', 'kili']
column_01 = []
for i in lst1:
column_01.append(i.encode())
f['name'] = column_01
f['age'] = [11,22,23]
print(f.keys())
print(f['name'][:])
print(f['age'][:])
f.close()
HDF5格式文件的读取:
# 安装tables模块,sudo pip3 install tables -i https://pypi.tuna.tsinghua.edu.cn/simple
import pandas as pd
data = pd.read_hdf('hd.h5')
data.head()
HDF5格式文件的存储:
import pandas as pd
data = pd.read_hdf('hd.h5')
data.to_hdf('hd.h5', key='data') # 注意这里必须有要有key
pd.read_hdf('hd.h5', key='data')
HDF5在存储的时候,使用的方式blosc,这种方式是速度读取快,也是pandas默认支持的。使用压缩提高磁盘利用率节省空间。HDF5还是跨平台的,可以轻松迁移到hadoop上面。
➢ JSON格式文件的读取与存储
JSON格式文件的读取:
JSON格式文件的存储:
本文地址:https://blog.csdn.net/Thanlon/article/details/107097106
上一篇: 内存又想涨价?!美光桃园晶圆厂突然停电